Il processo figlio è una copia quasi identica del processo padre. In particolare, la fork() esegue le seguenti operazioni:
Il punto 4 è molto importante e merita di essere approfondito meglio con un esempio. Se il processo padre ha dichiarato una variabile intera a il cui valore subito prima di eseguire la fork() e' di 5, subito dopo la fork() sia il padre che il figlio possiedono una variabile a = 5. Però, da questo momento in poi, le due variabili sono completamente distinte, una sta nello spazio privato del processo padre e l'altra sta nello spazio privato del processo figlio, e avranno vita diversa. Quindi, se successivamente il processo padre esegue l'istruzione a++, solo la sua variabile a verrà incrementata, mentre la variabile a che sta nel processo figlio conserverà il valore originale.
I due processi possono essere distinti consultando il valore di ritorno della fork(): il padre otterrà il PID del processo figlio, mentre il figlio otterrà 0. Un utilizzo della fork() può quindi essere il seguente:
Prima della fork() esiste un solo processo, che dichiara 3 variabili, res, a e b. Subito dopo la fork() esistono 2 processi, ognuno con il proprio spazio di memoria privato. Il processo padre possiede ancora 3 variabili, il cui valore è res = pid del figlio, a = 1 e b = 2. Il processo figlio possiede anch'egli le stesse 3 variabili, con valori res = 0, a = 1 e b = 2.
La parte di codice indicata con 1: viene eseguita de entrambi i processi: quindi, sia il padre che il figlio incrementano le loro rispettive variabili a e decrementano le loro variabili b, che quindi continuano ad avere gli stessi valori.
La parte di codice indicata con 2: viene eseguita soltanto ed esclusivamente dal processo figlio: infatti, soltanto nel processo figlio la variabile res ha il valore 0. Quindi, il processo figlio incrementa la sua variabile a che assume quindi il valore 3, mentre la variabile a del padre rimane al valore 2.
La parte di codice indicata con 3: viene eseguita soltanto ed esclusivamente dal processo padre, e quindi la sua variabile b assumerà il valore 5, mentre la variabile b del figlio resterà al valore 1.
Infine, la parte di codice indicata con 4: potrebbe, in generale, essere eseguita da entrambi i processi, a meno che uno dei due processi non decida di terminare prima nel suo ramo dell'if. Ad esempio, potrebbe darsi che il processo figlio invochi la primitiva exit nella parte 1:, e quindi non raggiungerà mai la parte 4:.
Come si vede, una soluzione di questo tipo non è però molto pratica, in quanto obbliga a scrivere il codice del processo figlio e quello del processo padre nei due blocchi then e else di un'istruzione if. Una soluzione per rendere il codice più leggibile può essere la seguente:
In questo caso, il corpo del figlio è stato spostato in una funzione separata, il maniera da rendere meno confuso il codice. Naturalmente, ci sono decine di modi di strutturare un programma, la fantasia è il solo limite!