Processes Have Parents

Every process running on your system has a parent process. Each process knows its parent process identifier (hereby referred to as ‘ppid’).

In the majority of cases the parent process for a given process is the process that invoked it. For example, you’re an OSX user who starts up and lands in a bash prompt. Since everything is a process that action started a new process, which in turn started a bash process.

The parent of that new bash process will be the process. If you then invoke ls(1) from the bash prompt, the parent of that ls process will be the bash process. You get the picture.

Since the kernel deals only in pids there is a way to get the pid of the current parent process. Here’s how it’s done in Ruby:

# Notice that this is only one character different from getting the
# pid of the current process.
puts Process.ppid

Cross Referencing

Leaving your irb session open run the following command at a terminal:

$ ps -p <ppid-of-irb-process>

That command should show a process called ‘bash’ (or ‘zsh’ or whatever) with a pid that matches the one that was printed in your irb session.

In the Real World

There aren’t a ton of uses for the ppid in the real world. It can be important when detecting daemon processes, something covered in a later chapter.

System Calls

Ruby’s Process.ppid maps to getppid(2).