繁体   English   中英

如何使用execvp在c中编写ls命令

[英]how to write ls command in c using execvp

我正在尝试编写一个简单的 ls 命令,所以我输入了“ls r”,我想检查我的代码是否正常。 输出没有显示任何内容。 这是代码:

int main(void){

  char *line;
  char *args[16];
  pid_t pid; 

    line = (char*)malloc(1024);
    printf("$ "); 
    fgets(line,1024,stdin);
     args[0] = strtok(line, " ");
     args[1] = strtok(NULL, " "); 

    printf("%s\n" , args[0]);
    printf("%s", args[1]);

    execvp(args[0], args);
}

谢谢大家。

查看现有自由软件外壳(即sashbash )的源代码并阅读高级 Linux 编程

阅读execvp(3)手册页。 请注意, execvp可能会失败。 当它成功时,它不会返回 此外, stdout(3)缓冲,您需要调用fflush(3)

您可能缺少一些基本的理解(shell 正在分叉进程,另请阅读fork(2) & execve(2)等...)

先试试:

int main(void){
 char line[1024];
 char *args[16];
 memset (args, 0, sizeof(args));
 printf("$ ");
 fflush(NULL); 
 fgets(line,sizeof(line),stdin);
 args[0] = strtok(line, " ");
 args[1] = strtok(NULL, " "); 
 printf("%s\n" , args[0]);
 printf("%s", args[1]);
 fflush(NULL);
 execvp(args[0], args);
 perror("execvp");
 return EXIT_FAILURE;
}

不要忘记fflush(3)fgetsexecvpperror所需的相关#include指令。

另请阅读errno(3) , syscalls(2) ...

使用gcc -Wall -g编译。 了解如何使用调试器gdbstrace

顺便说一句,真正的 shell 不使用strtok(3) 他们显式地解析该行(并且必须这样做,因为 shell 可以使用反斜杠或引号转义空格)。

实际上,试试strace ls 你会发现/bin/ls使用stat(2)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM