希望在 C++ 中 fork 一个不会挂起其父进程的进程 - 它的父进程是守护进程并且必须保持运行。如果我在 fork 进程上等待(), fork 的 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);
}
如果 execl 的命令不会失效,我如何在没有 wait(&pid) 的情况下 fork execl?
更新 通过在 fork 之前添加以下内容来修复
signal(SIGCHLD, SIG_IGN);
仍在以我有限的技能在基于已接受的答案的更兼容的解决方案中工作。谢谢!
最佳答案
默认情况下,wait
和 friend 会等到进程退出,然后再获取它。如果没有 child 退出,您可以调用带有 WNOHANG
的 waitpid
立即返回。
已失效/“僵尸”进程将一直等待,直到您等待
为止。所以如果你在后台运行它,你必须安排通过以下几种方式中的任何一种最终获得它:
- 定期尝试使用
WNOHANG
的waitpid
:int pid = waitpid(-1, &status, WNOHANG)
- 为
SIGCHLD
安装一个信号处理程序,以便在它退出时得到通知
此外,在 POSIX.1-2001 下,您可以使用 sigaction
在 SIGCHLD
上设置 SA_NOCLDWAIT
。或者将其操作设置为 SIG_IGN
。较旧的系统(包括 Linux 2.4.x,但不包括 2.6.x 或 3.x)不支持此功能。
检查您的系统联机帮助页,或者使用 wait in the Single Unix Specification . Single Unix Spec 还提供了一些有用的代码示例。 SA_NOCLDWAIT
记录在 sigaction 中.
关于c++ fork,没有等待,defuncts execl,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9164316/