gpt4 book ai didi

c++ fork,没有等待,defuncts execl

转载 作者:行者123 更新时间:2023-11-30 00:57:01 28 4
gpt4 key购买 nike

希望在 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 退出,您可以调用带有 WNOHANGwaitpid 立即返回。

已失效/“僵尸”进程将一直等待,直到您等待 为止。所以如果你在后台运行它,你必须安排通过以下几种方式中的任何一种最终获得它:

  • 定期尝试使用 WNOHANGwaitpid:int pid = waitpid(-1, &status, WNOHANG)
  • SIGCHLD 安装一个信号处理程序,以便在它退出时得到通知

此外,在 POSIX.1-2001 下,您可以使用 sigactionSIGCHLD 上设置 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/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com