Cuando un usuario está en su cuenta, le atiende el intérprete de comandos (shell), que es un proceso con un cierto identificador que puede averiguarse mediante el comando de usuario ps -f (la opción -f genera un árbol con las dependencias entre procesos)1.3. Por ejemplo:
Cuando el usuario solicita ejecutar un comando, como por ejemplo who para ver cuáles son los otros usuarios conectados al sistema, es necesario que nazca un nuevo proceso que soporte la ejecución de dicho comando. Cuando el shell (proceso padre) recibe la cadena ''who'', ejecuta la llamada al sistema operativo fork(), para crear un proceso hijo que es una copia idéntica a él mismo (shell) en lo que se refiere al ejecutable y a una parte del entorno. Obsérvese que el PPID (Parent PID) del proceso hijo es el PID del proceso padre. Así pues, hay dos procesos disjuntos, shell y who, que ejecutan lo mismo: el intérprete de comandos. A continuación el proceso padre se queda esperando con la llamada al sistema operativo wait() hasta que su hijo se ejecute. Mientras tanto el proceso hijo ejecuta la llamada exec() para cambiarse a si mismo su código ejecutable, con lo que sustituye el código del intérprete de comandos por el ejecutable binario del comando de usuario who , que corresponde al fichero /bin/who. A partir de este momento, el proceso hijo está ejecutando el comando de usuario who , y no el intérprete como había sucedido hasta ahora. Cuando el proceso hijo concluye su ejecución, ejecuta la llamada exit() que envía una señal signal() al proceso padre, la cual le despierta y permite continuar su ejecución mostrando el símbolo de espera de nuevo comando (normalmente: > o $ en la pantalla del terminal).