如何使用fork()来守护独立于其父进程的子进程?

时间:2012-01-27 17:58:12

标签: c fork

  

可能重复:
  In Linux, how to prevent a background process from being stopped after closing SSH client

我有一个 C 程序,我可以通过终端访问和交互(通常来自Linux机器上的SSH)。我一直试图找到问题的解决方案,在我关闭终端/注销后,流程以它结束(程序基本上要求一些选项然后进行业务,不需要进一步的交互,所以我想拥有它在我注销SSH之后继续运行)。

Linux中有一些方法可以避免这种情况,例如“屏幕”,但是我想用 C 以编程方式进行,而不依赖于屏幕等安装的软件包 - 即使这意味着重新发明轮子。

到目前为止,我理解fork()是守护进程的标准琐碎方式,那么是否有人可以帮助我完成允许上述过程发生的代码?

在父母内部:

 main()
{

//Do interactive stuff

signal(SIGCHLD, SIG_IGN); //stops the parent waiting for the child process to end

if(fork())
 exit(0);
// and now the program continues in the child process

我现在可以注销关闭原始shell的SSH ......并且孩子继续工作!

在孩子中:

//Continue with processing data/whatever the program does (no input/output to terminal required)
exit(0);

1 个答案:

答案 0 :(得分:12)

将进程与父进程分离

对子进程使用setsid(),它将在新会话中运行程序

 sid = setsid();

即使终端关闭也要保持程序正常运行

SIGHUP是当控制终端关闭时发送给进程的信号。

尝试使用

忽略它
signal (SIGHUP, SIG_IGN);