如何使用fork()将子进程独立于其父进程进行守护化?

30 浏览
0 Comments

如何使用fork()将子进程独立于其父进程进行守护化?

我有一个C程序,我通过终端(通常是在Linux上的SSH上)访问并与之交互。我一直在尝试解决一个问题,就是在我关闭终端/注销之后,进程也结束了(该程序基本上会要求一些选项,然后继续执行其任务,不需要进一步的交互,因此我希望在注销SSH之后它能继续运行)。Linux中有一些避免这个问题的方法,比如使用'screen',但我想以编程的方式在C中实现,而不依赖于安装的软件包,如screen - 即使这意味着重新发明轮子。

到目前为止,我了解到fork()是将进程变为守护进程的标准方式,所以有人可以帮助我完成上述描述的过程所需的代码吗?

在父进程中:

main()
{
    //执行交互式操作
    signal(SIGCHLD, SIG_IGN); //停止父进程等待子进程结束
    if(fork())
        exit(0);
    //现在程序在子进程中继续执行
}

现在我可以注销SSH,关闭原始的shell...而子进程会继续工作!

在子进程中:

//继续处理数据/程序所做的工作(不需要与终端进行输入/输出)
exit(0);

0
0 Comments

问题的原因是要将一个子进程与父进程分离,使其成为一个独立的守护进程。解决方法是使用fork()创建一个子进程,并在子进程中使用setsid()函数将其放入一个新的会话中,从而使它与父进程分离。此外,还可以通过忽略SIGHUP信号来使程序在终端关闭时继续运行。以下是整理后的文章:

使用fork()将子进程独立于其父进程的方法

为了将子进程与父进程分离,可以在子进程中使用setsid()函数,将其置于一个新的会话中。具体的代码如下:

sid = setsid();

这样,子进程将与父进程分离,成为一个独立的守护进程。

为了使程序在终端关闭时继续运行,可以忽略SIGHUP信号。可以使用以下代码来忽略该信号:

signal (SIGHUP, SIG_IGN);

但是,需要注意的是,以上代码需要在新的进程中注册信号处理程序,而不是在父进程中注册。

通过上述方法,可以实现将子进程独立于其父进程,并使程序在终端关闭时继续运行。使用setsid()函数可以将子进程置于一个新的会话中,从而与父进程分离。通过忽略SIGHUP信号,可以使程序在终端关闭时继续运行。

0