【问题标题】:Create multiple child processes and run execvp创建多个子进程并运行 execvp
【发布时间】:2016-11-11 15:23:43
【问题描述】:

我在C 中有一个函数,它创建一个子进程并使其运行execvp

int Execute(char **arg)
{
    pid_t pid;
    int status;

    if ((pid=fork()) == 0)
    {

        execvp(arg[0],arg);

        perror("Execvp error");
        exit(1);
    }

    else if (pid > 0)
    {
        waitpid(pid, &status, 0);
    }
    else
    {
        perror("Fork error");
        exit(2);
    }
}

现在我想将函数更改为实际运行execvp 几次(例如5 次),并让父进程等待所有子进程完成。尝试将其全部包装在 for 循环中,但 execvp 只执行一次。我知道基本上execvp'替换'当前程序代码,但不知道迭代是否继续。

感谢您的帮助!

【问题讨论】:

  • 注意exit不是信号安全的,你不应该在子进程中fork之后使用它。首选_Exit
  • 你能告诉我们你的循环吗?在子进程中要小心退出循环,并且只在父进程中调用 fork。另请注意,您可能必须收集所有子 PID。
  • 为什么你显示正在运行的代码并隐藏这个问题所涉及的版本,会说不工作的代码?
  • OT: status 未定义。
  • @alk 抱歉,我自己在玩这个for 循环,必须清理才能显示代码。忘记包含status 声明。

标签: c linux fork execvp


【解决方案1】:

首先,循环创建收集子 PID 的进程

pid_t pid[5];
int i;

for (i = 0; i < 5; i++) {
  if ((pid[i]=fork()) == 0) {
      execvp(arg[0],arg);

      perror("Execvp error");
      _exit(1);
  }
  if (pid[i] < 0) {
    perror("Fork error");
  }
}

其次,为每个有效的 PID 循环调用 waitpid。

for (i = 0; i < 5; i++) { 
  if (pid[i] > 0) {
    int status;

    waitpid(pid[i], &status, 0);
    if (status > 0) {
      // handle a process sent exit status error
    }
  } else {
    // handle a proccess was not started
  }     
}

【讨论】:

  • 感谢您的代码。它确实有效,但是是否有必要进行两个循环(也许还有其他方法)?似乎有点“不对”,但也许只适合我。
  • 我是否理解您的问题,您想快速启动子进程并并行运行它们?对 waitpid 或 wait 的调用确实会阻塞您的父进程,直到子进程完成,这就是您尽可能晚这样做的原因。
  • 是的,正确的。我需要运行它们并等待所有它们,或者不等待(两种情况,但我知道如何处理它们)。说到等待,我知道有wait(NULL);,它等待所有子进程完成,我认为第二个for循环可以用它代替,但它不起作用。也许有办法让它在这种情况下工作?
  • wait(0) 只会等到单个子进程完成,因此无论如何您都需要围绕等待调用进行循环。
  • @bdruemen:可以将WNOHANG 作为第三个参数传递给waitpid(),以防止其阻塞。这样就可以实现“一次循环”。
猜你喜欢
  • 1970-01-01
  • 2020-10-17
  • 2013-10-10
  • 2011-06-28
  • 2014-07-12
  • 1970-01-01
  • 1970-01-01
  • 2022-01-25
  • 2015-12-23
相关资源
最近更新 更多