C 在孩子跑步时用叉子做某事

C 在孩子跑步时用叉子做某事,c,unix,fork,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文件,说明它不再运行,以便家长知道孩子在该文件存在时已经退出,或者有更简单的方法来做到这一点?知道孩子已经终止(并获取其退出代码)的标准方法是使用waitpid()

所以基本上我需要的是:

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

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

我是否需要在孩子退出之前创建一个tmp文件,说明它不再运行,以便家长知道孩子在该文件存在时已经退出,或者有更简单的方法来做到这一点?

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

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

int status;
if (waitpid(pid, &status, WNOHANG) == 0) {
    // still running
}
使用
WNOHANG
waitpid
会立即返回,以便程序可以执行其他操作

当您除了等待子进程终止之外无事可做时,调用
waitpid
,而不调用
WNOHANG

检查
wait()
waitpid()

这里还有一些资源:

如果您只需要检查孩子是否停止运行,请使用系统
wait()
调用

int pid;
int status;
while (true)
{
  pid = wait(&status);
  if (pid < 0)
    //keep waiting
  else if (pid == 0)
    //child is done
}
intpid;
智力状态;
while(true)
{
pid=等待(&状态);
if(pid<0)
//继续等待
否则如果(pid==0)
//孩子完了
}

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


或者,您可以在else子句中添加一个while循环来检查waitpid。您将在轮询子状态之间执行离散的工作单元,并且不会在子进程退出时立即被中断。

一个线程是否足够,而不是创建一个子进程?当子进程退出时,您的进程应该得到一个SIGCHLD。线程更麻烦,并且对于这种类型的操作没有真正的优势罗布:你倒过来了。进程要麻烦得多,比如谁获取僵尸、全局状态、信号处理、pid重用上的竞争条件等等。所有这些头痛的问题都消失了。也许我没有通过fork()完成足够多的多任务,但我从来没有遇到过任何问题。