Ma perché il figlio dovrebbe terminare? per quello che ho letto l'esercizio vuole un possibile output di quella porzione di codice. Dato che nel codice non vedo motivo per cui il figlio debba terminare prima, l'output dovrebbe essere proprio 1233444, infatti:
- Viene stampato 1
- con la if del fork il processo si sdoppia, quindi in totale ci sono 2 processi
- ora il padre aspetta che un processo termini con la wait()
- viene stampato 2
- viene chiamata una fork, e qui viene a crearsi un altro processo, quindi ci sono 3 processi ora
- il primo figlio (o il secondo) stamperà 3
- il secondo figlio (o il primo) stamperà 3
- entrambi i figli escono dall' if...then...else
- il primo figlio (o il secondo) stampa 4
- il secondo figlio (o il primo) stampa 4
- adesso, indipendentemente che uno dei figli esca per primo, la wait() ritorna
- il padre stampa 4
- uscita del padre
L'output che ho scritto non è sicuro, infatti se hai letto bene prima ho scritto 'dovrebbe' è non 'è', quindi nessuno dice che i tuoi output non siano corretti, anzi ti dirò, ce ne possono essere altri si output, perché:
- se la seconda fork() restituisce -1, nessun processo è creato quindi ci sono solo 2 processi, in questo caso l'output potrebbe essere 12344
- se la prima fork () restituisce -1, allora l'output risulta essere 14, sempre che la wait() ritorni
Poi ovviamente ci sono eventuali uscite inaspettate da programma (signal ed eventuali) che possono ancora modificare l'output. Insomma, ci sono vari casi. Però, se si considera il caso normale, ovvero che nessun processo venga interrotto, e che tutti escano normalmente, allora l'output 'dovrebbe' essere quello che ti ho indicato prima.