可能重复:
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);
答案 0 :(得分:12)
将进程与父进程分离:
对子进程使用setsid(),它将在新会话中运行程序
sid = setsid();
即使终端关闭也要保持程序正常运行:
SIGHUP是当控制终端关闭时发送给进程的信号。
尝试使用
忽略它signal (SIGHUP, SIG_IGN);