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

时间:2014-04-12 12:17:30

标签: c linux shell ls 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);
}

谢谢大家。

1 个答案:

答案 0 :(得分:0)

查看现有免费软件shell的源代码(例如sashbash)并阅读Advanced Linux Programming

阅读execvp(3)手册页。请注意execvp可能会失败。成功时,它不会返回!另外,stdout(3) 已缓冲,您需要致电fflush(3)

您可能缺少一些基本的理解(shell是forking进程,也请阅读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)#includefgetsexecvp所需的相关perror指令。

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

使用gcc -Wall -g进行编译。了解如何使用调试器gdb以及strace

BTW,真正的shell不使用strtok(3);他们明确地解析了这行(并且他们必须这样做,因为shell可以使用反斜杠或引号来转义空格。)

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