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

标签 c fork

<分区>

Possible Duplicate:
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

我现在可以注销 SSH,这会关闭原来的 shell...而 child 继续它的工作!

在 child 中:

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

最佳答案

将进程与父进程分离:

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

 sid = setsid();

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

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

尝试使用

忽略它
signal (SIGHUP, SIG_IGN);

关于c - 如何使用 fork() 来守护独立于其父进程的子进程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9037831/

相关文章:

c - 使用 popen 时静默 tcpdump 的输出

c - 为什么没有分配 RARRAY_LEN?

c - 当子进程执行 execvp 时,waitpid 未收到退出状态

c++ - 流程处理的封装会产生问题

c - 为什么右移 C 中的负数会在最左边的位上带来 1?

Python ctypes : how to pass row outputs from a C function into a pandas DataFrame?

c - 在进程之间传递值

ruby - 通过 ruby​​ 进程共享变量

c - 无法将两个字符数组相互比较

c - fork 失败 : Cannot allocate memory