希望在c ++中分叉一个不会挂起其父进程的进程 - 它的父进程是守护进程并且必须保持运行.如果我在分叉进程上等待(),分叉的execl将不会分流 - 但是 - 它也会挂起应用程序 - 而不是等待修复应用程序挂起 - 但命令变得无法解决.
if((pid = fork()) < 0)
perror("Error with Fork()");
else if(pid > 0) {
//wait here will hang the execl in the parent
//dont wait will defunt the execl command
//---- wait(&pid);
return "";
} else {
struct rlimit rl;
int i;
if (rl.rlim_max == RLIM_INFINITY)
rl.rlim_max = 1024;
for (i = 0; (unsigned) i < rl.rlim_max; i++)
close(i);
if(execl("/bin/bash", "/bin/bash", "-c", "whoami", (char*) 0) < 0) perror("execl()");
exit(0);
}
Run Code Online (Sandbox Code Playgroud)
如果没有等待(&pid)execl的命令不会解散,我怎么能分叉execl?
更新 通过在fork之前添加以下内容来修复
signal(SIGCHLD, SIG_IGN);
Run Code Online (Sandbox Code Playgroud)
仍然根据我接受的答案在更兼容的解决方案中使用我的有限技能.谢谢!
默认情况下,wait
和朋友一起等待进程退出,然后收到它.您可以致电waitpid
与WNOHANG
如果没有孩子已经退出立即返回.
已经不存在/"僵尸"的过程会一直存在,直到你wait
上去.因此,如果您在后台运行它,您必须安排最终通过以下几种方式获取它:
waitpid
用WNOHANG
常规:int pid = waitpid(-1, &status, WNOHANG)
SIGCHLD
以便在退出时收到通知此外,在POSIX.1-2001下,您可以使用sigaction
set SA_NOCLDWAIT
on SIGCHLD
.或者将其动作设置为SIG_IGN
.较旧的系统(包括Linux 2.4.x,但不包括2.6.x或3.x)不支持此功能.
检查系统联机帮助页,或者在单Unix规范中替换等待.Single Unix Spec还提供了一些有用的代码示例.SA_NOCLDWAIT
在sigaction中记录.