Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/143.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
c++;fork,没有等待,execl就不存在了 查找叉过程,在C++中,它不会挂起它的父进程——它的父进程是守护进程,必须继续运行。如果我在forked进程上等待(),forked execl不会卸载-但是-它也会挂起应用程序-不等待修复应用程序挂起-但是命令变为deunt 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); }_C++ - Fatal编程技术网

c++;fork,没有等待,execl就不存在了 查找叉过程,在C++中,它不会挂起它的父进程——它的父进程是守护进程,必须继续运行。如果我在forked进程上等待(),forked execl不会卸载-但是-它也会挂起应用程序-不等待修复应用程序挂起-但是命令变为deunt 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); }

c++;fork,没有等待,execl就不存在了 查找叉过程,在C++中,它不会挂起它的父进程——它的父进程是守护进程,必须继续运行。如果我在forked进程上等待(),forked execl不会卸载-但是-它也会挂起应用程序-不等待修复应用程序挂起-但是命令变为deunt 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); },c++,C++,仍在使用我有限的技能,根据公认的答案找到更兼容的解决方案。谢谢 默认情况下,等待,好友等待进程退出,然后获取它。您可以使用WNOHANG调用waitpid,以便在没有孩子退出时立即返回 不起作用的/“僵尸”进程将一直等待,直到你等待它。因此,如果您在后台运行它,您必须通过以下几种方式中的任何一种来安排最终收获它: 使用WNOHANG尝试waitpid常规:int-pid=waitpid(-1,&status,WNOHANG) 为SIGCHLD安装一个信号处理程序,在退出时收到通知 此外,在P

仍在使用我有限的技能,根据公认的答案找到更兼容的解决方案。谢谢

默认情况下,
等待
,好友等待进程退出,然后获取它。您可以使用
WNOHANG
调用
waitpid
,以便在没有孩子退出时立即返回

不起作用的/“僵尸”进程将一直等待,直到你等待它。因此,如果您在后台运行它,您必须通过以下几种方式中的任何一种来安排最终收获它:

  • 使用
    WNOHANG
    尝试
    waitpid
    常规:
    int-pid=waitpid(-1,&status,WNOHANG)
  • SIGCHLD
    安装一个信号处理程序,在退出时收到通知
此外,在POSIX.1-2001下,您可以使用
sigaction
SIGCHLD
上设置
SA_NOCLDWAIT
。或者将其操作设置为
SIG\u IGN
。较旧的系统(包括Linux2.4.x,但不是2.6.x或3.x)不支持此功能


检查您的系统手册页,或选择。单一Unix规范还提供了一些有用的代码示例
sau NOCLDWAIT
记录在中。

默认情况下,
wait
和好友等待进程退出,然后获取它。您可以使用
WNOHANG
调用
waitpid
,以便在没有孩子退出时立即返回

不起作用的/“僵尸”进程将一直等待,直到你等待它。因此,如果您在后台运行它,您必须通过以下几种方式中的任何一种来安排最终收获它:

  • 使用
    WNOHANG
    尝试
    waitpid
    常规:
    int-pid=waitpid(-1,&status,WNOHANG)
  • SIGCHLD
    安装一个信号处理程序,在退出时收到通知
此外,在POSIX.1-2001下,您可以使用
sigaction
SIGCHLD
上设置
SA_NOCLDWAIT
。或者将其操作设置为
SIG\u IGN
。较旧的系统(包括Linux2.4.x,但不是2.6.x或3.x)不支持此功能


检查您的系统手册页,或选择。单一Unix规范还提供了一些有用的代码示例<代码>SA_NOCLDWAIT在中有文档记录。

我认为信号处理器是最好的方法,如图所示。我想指出另一种处理方法:Fork两次,让孩子退出,而孙子调用
execl
。然后,init进程将清除已失效的进程。

我认为信号处理程序将是最好的方法,如图所示。我想指出另一种处理方法:Fork两次,让孩子退出,而孙子调用
execl
。然后,init进程将清除已失效的进程。

如评论中所述,double fork将进程从已失效状态保存下来


正如评论中所说,双叉将进程从失效状态保存下来


最简单的解决方案是添加一个信号(SIGCHLD,SIG_IGN);在使用叉子之前,我尝试了几乎所有超出我有限技能范围的其他选择。我会继续尝试,以防人们想使用2.4.x。最简单的解决方案是添加一个信号(SIGCHLD,SIG_IGN);在使用叉子之前,我尝试了几乎所有超出我有限技能范围的其他选择。我会继续尝试,以防人们想使用2.4.x。我尝试了双叉,但在我的情况下,由于某种原因它不起作用。我在另一个堆栈问题中也建议使用双叉,但总体而言,我认为这并不是实现这一点的最佳方式。我同意这一点,这就是为什么我认为信号处理器更好的原因,但我想我还是要提到它。我试过双叉,但在我的情况下,由于某种原因它不起作用。我在另一个堆栈问题中也推荐了double fork,但通常认为它并不是实现这一点的最佳方法,我同意,这就是为什么我认为信号处理程序更好的原因,但我想我应该提到它。这是一个界限。你应该扩展你的答案,在这里包含尽可能多的信息,并使用链接仅供参考。这是一个边界。您应该扩展您的答案,在此处包含尽可能多的信息,并使用该链接仅供参考。
signal(SIGCHLD, SIG_IGN);