c - execv 适用于 "/bin/ls"但不适用于 "pwd"

标签 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!");
    }

最佳答案

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

此外,使用 perror 打印库/系统函数的错误消息。它会告诉您函数失败的原因。

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

关于c - execv 适用于 "/bin/ls"但不适用于 "pwd",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53326196/

相关文章:

c - 为什么 pthread_key 需要析构函数?

unix - 从 OCaml 内部调用外部程序

c - -> 使用 execv 运行 wc 命令

c - 取消引用指向整个数组的指针

c - C中获取换行的隐藏字符

c - 试图找到一个完全随机数生成器

php - bash脚本中的转义字符

c - 如果我 fork() 然后执行 execv(),谁拥有控制台?

php - 如何在 PHP 客户端和 C 守护程序服务器之间进行 IPC?

c - 如何使用 linux 内核中的 lockdep 功能进行死锁检测