所以基本上我需要的是:使用叉子做一些事情,而孩子正在运行
pid = fork();
if (pid == -1)
exit(1);
if (pid == 0)
{
// do stuff in child
}
else
{
// ONLY do stuff while child is running
}
我需要建立一个tmp文件孩子退出表达权之前,它不再运行,所以父知道该文件存在时孩子已退出,还是有更简单的方法来执行此操作?
所以基本上我需要的是:使用叉子做一些事情,而孩子正在运行
pid = fork();
if (pid == -1)
exit(1);
if (pid == 0)
{
// do stuff in child
}
else
{
// ONLY do stuff while child is running
}
我需要建立一个tmp文件孩子退出表达权之前,它不再运行,所以父知道该文件存在时孩子已退出,还是有更简单的方法来执行此操作?
您可以使用waitpid
知道,如果一个子进程仍在运行:
int status;
if (waitpid(pid, &status, WNOHANG) == 0) {
// still running
}
随着WNOHANG
,立即waitpid
退回,使得程序可以做别的事情。
除了等待子进程终止以外,您无需任何操作,请拨打waitpid
而不使用WNOHANG
。
知道孩子已经终止(并获得退出代码)的标准方法是使用系统调用waitpid()
。
使用系统调用wait()
如果你只需要检查,如果孩子已经停止运行。
int pid;
int status;
while (true)
{
pid = wait(&status);
if (pid < 0)
//keep waiting
else if (pid == 0)
//child is done
}
有很多方法可以做到这一点。如果你不需要对子输出做任何事情,你可以设置一个SIGCHLD处理程序来收集子进程退出时的状态,然后在主执行线程中忘掉它。您可以使用SIGCHLD处理程序通过IPC机制标记子进程的退出。
或者你可以添加一个while循环来检查你的else子句中的waitpid。您将在子女状态的民意调查之间进行独立的工作单位,您不会在子女出口时立即中断工作。
线程是否足够而不是创建子进程? – Furicane
当子进程退出时,你的进程应该得到一个SIGCHLD。 –
线程更麻烦,并且没有提供这种类型的真正优势。 –