[英]Waitpid and fork/exec's non-blocking advantage over a syscall?
我总是听到您永远不要使用system()
,而应该使用fork/exec
因为system()会阻止父进程。
如果是这样,我是否通过调用waitpid()
做错了事,当我执行fork/exec
时, waitpid()
也阻塞了父进程? 有没有办法解决waitpid
...我一直认为在进行fork/exec
时有必要。
pid_t pid = fork();
if (pid == -1)
{
// failed to fork
}
else if (pid > 0)
{
int status;
waitpid(pid, &status, 0);
}
else
{
execve(...);
}
如果您想在子进程关闭时做其他事情,则可以为SIGCHLD设置陷阱,以处理子进程的完成/退出。 就像在这个非常简单的示例中一样。
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
pid_t pid;
int finished=0;
void zombie_hunter(int sig)
{
int status;
waitpid(pid, &status, 0);
printf("Got status %d from child\n",status);
finished=1;
}
int main(void)
{
signal(SIGCHLD,zombie_hunter);
pid = fork();
if (pid == -1)
{
exit(1);
}
else if (pid == 0)
{
sleep(10);
exit(0);
}
while(!finished)
{
printf("waiting...\n");
sleep(1);
}
}
我总是听到您永远不要使用
system()
,而应该使用fork/exec
因为system()会阻止父进程。
永远不要把话说绝了。 如果system()
具有您想要的语义,包括但不限于阻止调用过程,则请务必使用它! 不过,请确保您了解所有这些语义。
如果您的目标是避免阻塞父进程,那么了解父进程可以在派生孩子与通过其中的一个wait()
函数集进行收集之间执行无穷的工作量,这一点很重要。 这非常类似于启动新线程,继续进行其他工作,然后最终加入线程。
而且,如果父母不需要知道或关心孩子何时终止,那么就可以完全避免等待。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.