我试图在python中创建一个守护进程。我发现了下面的问题,其中有一些很好的资源,我目前正在关注,但我很好奇为什么需要双分叉。我对谷歌进行了研究,发现了大量的资源,这些资源都表明这是必要的,但不知道为什么。
有人提到这是为了防止守护进程获取控制终端。如果没有第二个分叉,它将如何做到这一点?后果是什么?
我试图在python中创建一个守护进程。我发现了下面的问题,其中有一些很好的资源,我目前正在关注,但我很好奇为什么需要双分叉。我对谷歌进行了研究,发现了大量的资源,这些资源都表明这是必要的,但不知道为什么。
有人提到这是为了防止守护进程获取控制终端。如果没有第二个分叉,它将如何做到这一点?后果是什么?
当前回答
关于它的一个像样的讨论似乎在http://www.developerweb.net/forum/showthread.php?t=3025上
引用mlampkin的话:
...将setsid()调用视为做事的“新”方式(与终端分离),而[第二个]fork()调用作为处理SVr4的冗余…
其他回答
关于它的一个像样的讨论似乎在http://www.developerweb.net/forum/showthread.php?t=3025上
引用mlampkin的话:
...将setsid()调用视为做事的“新”方式(与终端分离),而[第二个]fork()调用作为处理SVr4的冗余…
摘自Bad CTK:
在某些类型的Unix上,为了进入守护进程模式,你不得不在启动时执行双叉操作。这是因为单分叉不能保证与控制终端分离。”
一个原因是父进程可以立即为子进程wait_pid(),然后忘记它。当孙子孙女死亡时,它的父节点是init,它将wait()等待它——并将它从僵尸状态中取出。
结果是,父进程不需要知道被分叉的子进程,这也使得从库等中分叉长时间运行的进程成为可能。
如果daemon()调用成功,则有父调用_exit()。最初的动机可能是让父母在孩子守护的时候做一些额外的工作。
这也可能是基于一种错误的信念,认为这是必要的,以确保守护进程没有父进程,并被重新父化给init——但在单分叉的情况下,一旦父进程死亡,无论如何都会发生这种情况。
所以我认为这一切最终都归结为传统——只要父母在短时间内死亡,一个分叉就足够了。
这样也许更容易理解:
第一个fork和setsid将创建一个新的会话(但是进程ID ==会话ID)。 第二个fork确保进程ID !=会话ID。