检测父进程的死亡

时间:2012-08-30 09:15:11

标签: c linux

如何在Linux OS中检测父进程死亡?

如果在名为fork()的父进程中,则创建子进程。在父进程中,我可以使用系统调用wait()来等待已终止的子进程,并获取其状态。

但是,我找不到有关子进程如何检测父进程死亡的信息?

3 个答案:

答案 0 :(得分:11)

您可以通过调用getppid()然后通过kill()发送信号0来获取父进程ID。返回码0表示进程仍处于活动状态。

如@Ariel所述,getppid()将返回原始父级的pid或者init的pid,这将是pid 1.因此,您必须通过调用getppid()来存储父级pid在启动时或稍后检查您的父母是否有pid 1。

根据Linux上的this answer,您还可以通过prctl()的{​​{1}}选项和自选信号检测父亲的死亡。

答案 1 :(得分:3)

在我的Ubuntu 16.04.1中,LTS getppid()在父命令后不返回“1”但是进程“/ sbin / upstart --user”的id,所以检查getppid()== 1将不起作用并且getppid()应该在孩子开始时保存并稍后进行比较。

答案 2 :(得分:0)

如果父进程和子进程在生命周期中都受到您的控制,则最可移植的方法是与父进程共享一半的管道或套接字。

  1. 在进行分叉之前,先打开pipe()或socketpair()。
  2. 叉后,
    1. 在父级中,关闭管道或第一个套接字的读取端。
    2. 在子级中,关闭管道或第二个套接字的写端。
  3. 在父级中,将剩余的文件描述符藏起来并忘了它。
  4. 在孩子中,使用任何一种IO复用方法(选择,轮询等)来测试描述符的可读性
  5. 如果描述符变得可读,则几乎可以确定父级已死,或者某些罕见的错误导致了误写入,您可以通过调用read()进行检查。如果父对象确实死了,则read()将返回0个字节。

此方法的优点是它完全避免了信号(这是UNIX中最难掌握的机制之一),并提供了可以轻松地与网络多路复用器或GUI事件循环集成的可等待描述符。

相关问题