【问题标题】:Using fork and execvp in c causing error在 c 中使用 fork 和 execvp 导致错误
【发布时间】:2014-04-23 16:00:07
【问题描述】:

我正在尝试使用 fork/execvp 从我的 C 程序中执行另一个程序。它正在工作,但是在 ls 输出我的目录的内容之前,我得到了几百行:

ls: cannot access : No such file or directory

接着是目录中文件的正确列表。我正在传递给 execvp:

char **argv = {"ls", "/home/school/"};
char *command = "ls";

由于某种原因,当我使用路径“/home/school”时,它找不到目录。有谁知道为什么会发生这种情况以及为什么 ls 说它无法访问?

PID  = fork();
i = 0;
if(i == numArgs) { doneFlag = 1; }
    if (PID == 0){//child process
        execvp(command, argv);//needs error checking
    }
    else if(PID > 0){
        wait(PID, 0, 0);//wait for child process to finish execution
    }
    else if(PID == -1){
        printf("ERROR:\n");
        switch (errno){
            case EAGAIN:
         printf("Cannot fork process: System Process Limit Reached\n");
         case ENOMEM:
         printf("Cannot fork process: Out of memory\n");
        }
        return 1;
    }

【问题讨论】:

  • 也许可以试试char **argv = {"ls", "/home/school/", (void*)0}; ?
  • (void*)0 需要用引号引起来吗?我在使用 (void*)0 时收到警告
  • OT:您应该在错误cases 中添加break 语句
  • @user1768079 (char *)0 是正确的。

标签: c execvp


【解决方案1】:

execvexecvp 函数提供了一个指向 空终止字符串 表示新程序可用的参数列表。

第一个参数应该指向与正在执行的文件关联的文件名。

指针数组必须NULL指针终止。在argv* 的末尾附加0NULL

【讨论】:

  • argv 的最后一个元素必须是NULL(char *)0 但不能是'\0'
  • 谢谢,这个答案+评论为我回答了这个问题。它现在按预期工作。
  • 感谢@IngoLeonhardt 指出这一点。我碰巧很容易弄乱指针和字符串。
【解决方案2】:

execvp() 中传递的char** 参数必须以NULL 终止。

【讨论】:

  • 你是指char**存储的字符串还是char**本身,比如最后一行必须是空指针?
  • @user1768079 char*s 列表中的最后一个元素必须是 NULL。希望这会有所帮助!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-11-09
  • 1970-01-01
  • 2010-12-07
  • 2011-06-28
  • 2015-04-14
  • 1970-01-01
  • 2010-09-23
相关资源
最近更新 更多