【问题标题】:How to use fork() to daemonize a child process independent of its parent? [duplicate]如何使用 fork() 来守护独立于其父进程的子进程? [复制]
【发布时间】:2012-02-20 17:02:26
【问题描述】:

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

我有一个 C 程序,我通过终端访问并与之交互(通常来自 linux 机器上的 SSH)。我一直在尝试找到问题的解决方案,在我关闭终端/注销后,该过程以它结束(程序基本上要求一些选项,然后在不需要进一步交互的情况下开始其业务,所以我想拥有它即使在我注销 SSH 后仍继续运行)。

在 linux 中有一些方法可以避免这种情况,例如 'screen',但我想使用 C 以编程方式进行,而不依赖于已安装的软件包(例如 screen)——即使这意味着重新发明轮子。

到目前为止,我理解 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);

【问题讨论】:

  • 嗯,运行时使用nohup?无需分叉。
  • @Brian,nohup 不会让我与程序互动。它是一个命令行交互。
  • @San,我想在不依赖安装 nohup 的情况下达到同样的目的。
  • 查看建议的线程:答案 #2 建议使用 GNU Screen 实用程序,它允许您跨 shell 会话重新连接到给定的“虚拟终端”。

标签: c fork


【解决方案1】:

从父进程中分离进程

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

 sid = setsid();

即使终端关闭也能保持程序运行

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

尝试使用

忽略它
signal (SIGHUP, SIG_IGN);

【讨论】:

  • 是的,其他人建议使用 nohup 启动程序,但您能否建议如何在我发布的代码上下文中以编程方式执行此操作?
  • @User 你可以为这个忽略它的信号安装一个信号处理程序。只需确保将处理程序注册到新进程,而不是父进程。 gnu.org/software/libc/manual/html_node/Signal-Handling.html
  • 你不需要信号 (SIGHUP, SIG_IGN);因为父进程退出,因此子进程没有控制进程
猜你喜欢
  • 2016-03-18
  • 2014-12-06
  • 1970-01-01
  • 2015-10-07
  • 1970-01-01
  • 1970-01-01
  • 2017-12-09
  • 2014-03-05
  • 2011-07-20
相关资源
最近更新 更多