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

标签 c++

希望在 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/

相关文章:

c++ - 我将如何在 O(1)(摊销)中执行此任务?

c++ - 矩形算法中的多边形?

c++ - 静态与非静态变量 C++

c++ - Qt 没有用于 QProcess::finished() 信号的插槽

c++ - mciSendString() 设置音频音量错误 261

c++ - 通过构造函数参数推断模板参数

c++ - 删除共享指针

c++ - 交换单链表节点创建一个无限循环

c++ - 使用数组 C++ 的动态堆栈

c++ - 采用默认参数的构造函数中的语法错误 `std::map`