Detect death of parent process

If both the parent and child process are under your control for their lifetime, the most portable method is to share one half of a pipe or socket with the parent.

  1. Prior to fork, open a pipe() or socketpair().
  2. After fork,
    1. in the parent, close the read end of the pipe, or the first socket.
    2. in the child, close the write end of the pipe, or the second socket.
  3. In the parent, stash the remaining file descriptor away and forget about it.
  4. In the child, use any of the multiplexed IO methods (select, poll, etc.) to test the descriptor for readability
  5. If the descriptor becomes readable, the parent is almost certainly dead, or some rare bug caused a stray write, which you can check for by calling read(). If the parent really was dead, read() will return 0 bytes.

The advantage of this method is that it completely avoids signals, which are one of the hardest to master mechanisms in UNIX, and provides a waitable descriptor that can easily be integrated with a network multiplexer or GUI event loop.


You can get the parent process id by calling getppid() and then sending signal 0 via kill(). A return code of 0 will indicate that the process is still alive.

As mentioned by @Ariel, getppid() will either return the pid of the original parent or that of init, which will be pid 1. So you either have to store the parent pid by calling getppid() at startup or later check if your parent has pid 1.

According to this answer on Linux you can also detect the death of the parent via prctl()'s PR_SET_PDEATHSIG option and a self-chosen signal.

Tags:

Linux

C