【问题标题】:execve() returning error on first loop onlyexecve() 仅在第一个循环中返回错误
【发布时间】:2014-10-19 16:38:16
【问题描述】:

我对此困惑了一段时间,现在我需要一些帮助。 我正在尝试创建一个循环,该循环将分叉一个子进程并通过 execve() 调用“echo hello”。

#include <stdio.h>  
#include <stdlib.h>
#include <sys/wait.h>

int main(int argc, char *argv[],char *envp[]){

  int i = 0;

  while(i<10){ 
    pid_t pid;
    pid = fork();

    if(pid != 0){
      int status;
      waitpid(-1, &status, 0);
    }

    if(pid == 0) {
      char *arg_array[2];
      arg_array[0]="echo";
      arg_array[1]="hello";
      char filename[] = "/bin/echo";     
      if (execve(filename,arg_array,envp) == (-1)) {
        printf("ERROR!\n");
        exit(1);
      }
    }  
    i++;
  }
}

最初,代码在第一次运行时失败,而在随后的每次运行中都成功。 现在,在清理它以在这里展示之后,它根本不会成功 - 我得到的只是错误! x 10. 我一定是进一步破坏了什么,我不知道是什么。

这只是我在这个网站上的第二个问题,所以如果您有任何改进我的问题/建设性批评的建议,请分享!谢谢你。

【问题讨论】:

    标签: c exec fork waitpid


    【解决方案1】:

    您缺少argv 数组的最后一个NULL 元素。在execve 之后使用perror 也会为您提供正确的错误消息。因此:

    char *arg_array[3]; arg_array[0] = "echo"; arg_array[1] = "hello"; arg_array[2] = NULL;

    另外,你缺少#include &lt;unistd.h&gt;

    【讨论】:

    • 哈!那解决了!精彩的。 unistd.h 有什么作用呢?没有它似乎也能正常工作。
    • 阅读给定函数的文档并查看哪个标准头文件声明它总是有用的。在我的系统上,我收到有关隐式声明的警告。也许在您的系统上&lt;sys/wait.h&gt; 会自动包含&lt;unistd.h&gt;,但情况并非总是如此。
    • 谢谢,我现在明白了。我还是一个初学者,所以虽然我查看了文档,但我并不能完全理解 &lt;unistd.h&gt; 做了什么。
    猜你喜欢
    • 2023-03-16
    • 2020-06-01
    • 2018-07-11
    • 2017-11-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-25
    • 2021-05-02
    相关资源
    最近更新 更多