execv适用于“ / bin / ls”,但不适用于“ pwd”

时间:2018-11-15 18:56:50

标签: c unix execv

我是Unix上C编程语言的新手,正在尝试构建类似shell的C程序。但是,如果我尝试根据自己的选择更改功能,程序将出错。 例如,看起来/ bin / ls -l可以正常工作,而pwd则无法工作。这可能很简单,但我无法理解问题。

if (fork() == 0)
{
    char* argv[3];
    argv[0] = "/bin/ls";
    argv[1] = "-l";
    argv[2] = NULL;

    if(execv(argv[0], argv)==-1)
        printf("Error in calling exec!!");

    printf("I will not be printed!\n"); 
}

此功能正在工作。我可以在shell上清楚地看到结果。 但是,如果我要这样更改,则会显示错误。

if(fork() == 0){
   char * argv[2];

   argv[0] = "pwd";
   argv[1] = NULL;

   if(execv(argv[0], argv) == -1)
       printf("Error in calling exec!");
    }

1 个答案:

答案 0 :(得分:4)

execv函数不会搜索要运行的命令的路径,因此无法找到pwd。它可以找到ls,因为您指定了可执行文件的完整路径。请改用execvp,它会进行路径搜索。

此外,使用perror打印有关库/系统功能的错误消息。它将告诉您功能为何失败。

if(execvp(argv[0], argv) == -1)
    perror("Error in calling exec!");