Process groups, sessions, parents and so on
Jump to navigation
Jump to search
Here's a little program that can be used to help understand some of the intricate aspects:
#include <stdio.h> #include <stdlib.h> #include <unistd.h> int main(void) { pid_t p; printf("parent: %d\n", getpid()); if ((p = fork()) == 0) { if ((p = fork()) == 0) { setsid(); if ((p = fork()) == 0) { if ((p = fork()) == 0) { pause(); } pause(); } exit(0); } pause(); } pause(); return 0; }
Compile and run this, and then check the results. On Linux, like this:
stian@ubuntu04:~$ ps -C poop -o pid,ppid,pgid,sid,tty,cmd PID PPID PGID SID TT CMD 17017 3516 17017 3516 pts/1 ./poop 17018 17017 17017 3516 pts/1 ./poop 17019 17018 17019 17019 ? [poop] <defunct> 17020 1 17019 17019 ? ./poop 17021 17020 17019 17019 ? ./poop
Now let that sink in. Questions to ask yourself:
- Why is 17020's ppid 1?
- Why is session and process group different to begin with, then not?
- Why is one process defunct?
- Why don't the last 3 have a controlling tty?
- How come the first process got a new process group?
- Why is UNIX so complicated?
Note: The author (Stian) doesn't know the answers to several of these.