c ++ fork()& execl()不要等待,完全分离

时间:2012-01-17 01:18:57

标签: c++

所以我有一个简单的fork和exec程序。它工作得很好,但我希望能够分离启动的进程,我尝试一个没有等待的分支:

if((pid = fork()) < 0)
    perror("Error with Fork()");
else if(pid > 0) {
    return "";
}
else {
    if(execl("/bin/bash", "/bin/bash", "-c", cmddo, (char*) 0) < 0) perror("execl()");
    exit(0);
}

它启动proc很好,但是当我的主应用程序关闭时 - 我的分叉过程也是如此。

如何在主proc(启动它)关闭后保持forked进程运行?

谢谢:D

2 个答案:

答案 0 :(得分:3)

你真正想要的只是在fork()ed过程中忽略SIGHUP,因为这通常是使程序失效的过程。也就是说,你需要做的是

signal(SIGHUP, SIG_IGN);

使用nohup安排读者出现,避免写入关闭管道。为避免这种情况,您可以安排标准输出不可用,也可以忽略SIGPIPE。有些信号会在不被忽略时终止你的程序(参见man signal;有些信号不能被忽略),但是发送给孩子的信号是SIGHUP

答案 1 :(得分:2)

如果要启动分离/守护进程,可以执行各种操作:

  • 再次fork并退出第一个子节点(因此第二个子进程不再将原始进程作为其父pid)
  • 调用setsid(2)以获取新会话和进程组
  • 重新打开stdin / stdout / stderr以取消引用控制tty,如果有的话。或者,例如,您可能已经继承了一个将被破坏的管道标准输出,如果您尝试编写它,则会为您提供SIGPIPE。
  • chdir to / to远离祖先的当前目录