在孩子跑步时用fork做某事

时间:2011-08-23 16:39:18

标签: c unix fork

基本上我需要的是:

pid = fork();
if (pid == -1)
   exit(1);

if (pid == 0)
{
   // do stuff in child
}
else
{
   // ONLY do stuff while child is running
}

我是否需要在子退出之前创建一个tmp文件,说它不再运行,以便父文件知道该文件存在时子项已退出,或者是否有更简单的方法可以执行此操作?

5 个答案:

答案 0 :(得分:4)

您可以使用waitpid来了解子进程是否仍在运行:

int status;
if (waitpid(pid, &status, WNOHANG) == 0) {
    // still running
}

使用WNOHANGwaitpid会立即返回,以便程序可以执行其他操作。

如果除了等待子进程终止之外没有其他任何操作,请在没有waitpid的情况下致电WNOHANG

答案 1 :(得分:1)

知道孩子已经终止(并获得退出代码)的标准方法是使用waitpid()系统调用。

答案 2 :(得分:1)

答案 3 :(得分:1)

有很多方法可以做到这一点。如果您不需要对子输出执行任何操作,则可以设置SIGCHLD处理程序以在子项退出时重新获取子项,然后在主执行线程中将其遗忘。您可以使用SIGCHLD处理程序通过IPC机制标记子进程的退出。

或者你可以在else子句中添加一个检查waitpid的while循环。您将在子州的民意调查之间进行离散的工作单元,并且您不会在孩子退出时立即中断。

答案 4 :(得分:0)

如果您只是需要检查孩子是否已停止跑步,请使用系统wait()来电。

int pid;
int status;
while (true)
{
  pid = wait(&status);
  if (pid < 0)
    //keep waiting
  else if (pid == 0)
    //child is done
}