Sei sulla pagina 1di 4

UNIX

Un processo può porsi in attesa che uno dei


suoi processi figli termini eseguendo la
system call wait()
int wait(int *stat);
wait restituisce il PID del figlio che ha
terminato
stat: puntatore ad un intero che conterrà il
valore restituito dal processo figlio { se il figlio
termina con exit(stato), l'oggetto puntato da
stat è il valore stato passato alla sc exit}
Il processo che esegue la wait():
- sospende l'esecuzione finché un(*)
processo figlio non termina
- al ritorno dalla wait() riprende l'esecuzione
dal punto successivo a wait().
(*)
se ha più figli, viene sospeso fino alla
terminazione del figlio che termina per primo.
La sc wait() incorre in errore se
- il processo chiamante non ha figli
- stat punta ad un indirizzo di memoria non
valido

35
UNIX
Valori restituiti dalla sc wait()
informazioni contenute nella variabile intera
puntata da stat: si considerano solo i 16 bit
meno significativi

8 bit 8bit
argomento 0x00 il figlio ha chiamato
di exit exit(stato)
(gli 8 bit
meno
significativi
di stato)

8 bit 1 bit 7 bit


0x00 core numero il figlio è stato
flag del terminato da
segnale un segnale

core flag: 1 se il processo terminato ha


generato un file core nella directory corrente.

36
UNIX
Es. di uso di wait()
#include <stdio.h>
main()
{
int stato=0;
if (fork())
{
wait(&stato);
printf("Sono il processo padre - pid=%d,
ppid=%d\n",getpid(), getppid());
printf("Il processo figlio ha restituito lo
stato %d\n", stato);
}
else
{
printf("Sono il processo figlio - pid=%d,
ppid=%d\n",getpid(), getppid());
}
exit(0);
}

Output:
% sono il processo figlio- pid=941, ppid=940
sono il processo padre- pid=940, ppid=907
il processo figlio ha restituito lo stato 0
37
UNIX

Un processo figlio termina con exit():


1. il processo padre ha invocato la wait():
la wait fa ritorno al padre, al quale viene
passato lo stato di terminazione del figlio.
2. il processo padre non sta eseguendo
una wait(): il figlio terminante diventa un
processo zombie.
Zombie: processo terminato, il cui padre non
ha ancora eseguito la wait per attenderne la
fine.
Il kernel rilascia tutte le risorse utilizzate
dallo zombie, ma ne mantiene lo stato di
terminazione e statistiche temporali per il
processo padre fino alla terminazione di
quest'ultimo.

Il kernel mantiene l'elemento in tabella dei


processi corrispondente al processo
zombie.

Se il figlio zombie aveva dei figli, il loro PPID


diventa 1 (quello di init).

38