2011-08-23 47 views
3

所以基本上我需要的是:使用叉子做一些事情,而孩子正在运行

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

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

我需要建立一个tmp文件孩子退出表达权之前,它不再运行,所以父知道该文件存在时孩子已退出,还是有更简单的方法来执行此操作?

+0

线程是否足够而不是创建子进程? – Furicane

+3

当子进程退出时,你的进程应该得到一个SIGCHLD。 –

+1

线程更麻烦,并且没有提供这种类型的真正优势。 –

回答

4

您可以使用waitpid知道,如果一个子进程仍在运行:

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

随着WNOHANG,立即waitpid退回,使得程序可以做别的事情。

除了等待子进程终止以外,您无需任何操作,请拨打waitpid而不使用WNOHANG

1

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

0

使用系统调用wait()如果你只需要检查,如果孩子已经停止运行。

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

有很多方法可以做到这一点。如果你不需要对子输出做任何事情,你可以设置一个SIGCHLD处理程序来收集子进程退出时的状态,然后在主执行线程中忘掉它。您可以使用SIGCHLD处理程序通过IPC机制标记子进程的退出。

或者你可以添加一个while循环来检查你的else子句中的waitpid。您将在子女状态的民意调查之间进行独立的工作单位,您不会在子女出口时立即中断工作。

相关问题