检测父进程的死亡

Sim*_*lex 12 c linux

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

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

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

sca*_*cai 10

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

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

根据这个答案在Linux上,你还可以通过检测的父母去世prctl()PR_SET_PDEATHSIG选项和自我选择的信号.

  • 我不认为,不断检查改变ppid它是好的,想法.我需要在异步操作中.我认为,使用prctl()是最佳解决方案. (2认同)

dmw*_*dmw 5

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

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

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