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.