PDA

View Full Version : [C]waitpid


pavimento
18-11-2006, 10:24
Ciao a tutti,
vorrei creare un processo figlio che non viene atteso dal padre,ma che quando termina stampa un messaggio che informa della sua terminazione.

quello che ho fatto io è usare una waitpid non sospensiva:


/**********/

while((pid=waitpid(WAIT_ANY,&status,WNOHANG))>0)
printf("Processo terminato");

/*******/

il processo padre continua la sua esecuzione senza attendere il figlio, ma quando il figlio termina non stampa nulla. Cosa sbaglio?

grazie
ciao :)

pela
18-11-2006, 11:21
un altro modo può essere l'installazione di un signal handler per gestire il segnale SIGCHLD (vedi funzione sigaction), dentro l'handler poi stampi la stringa e chiami la wait per eliminare il processo zombie

sirus
18-11-2006, 11:42
Non ho ben capito dal tuo post se è il figlio a dover stampare a video informazioni sulla sua terminazione oppure è il padre che pur disinteressandosi del figlio appena lo vede terminato stampa a video le informazioni necessarie. :)

Il primo caso è un non problema perché appena prima di terminare il figlio puoi fare in modo che stampi tutto il necessario, se è il secondo caso che ti interessa potresti inviare dal figlio al padre un "segnale" che lo informa della sua prossima terminazione. ;)

pavimento
18-11-2006, 12:18
da quel che ho capito da sigaction quando un figlio termina manda un segnale di SIGCHLD al padre.


ho provato a fare così,ma mi sa che non sia molto corretto



/*****/

struct sigaction sa;

sa.sa_handler=funz;
sigaction(SIGCHLD,&sa,NULL);

/*****/

void funz(){
while((ret=waitpid(WAIT_ANY,&status,WNOHANG))>0){
printf("processo terminato\n");
}
}

/*****/


Così funziona, ma non ne capisco né il senso né il motivo.
Quando il figlio termina manda un segnale SIGCHLD al padre che fa una waitpid. Che senso ha aspettare un figlio se so che è già terminato?

( Dovrebbe essere il padre che pur disinteressandosi del figlio appena lo vede terminato stampa a video le informazioni necessarie)

grazie :)
Ciao :)

sirus
18-11-2006, 12:22
....
Così funziona, ma non ne capisco né il senso né il motivo.
Quando il figlio termina manda un segnale SIGCHLD al padre che fa una waitpid. Che senso ha aspettare un figlio se so che è già terminato?

(Dovrebbe essere il padre che pur disinteressandosi del figlio appena lo vede terminato stampa a video le informazioni necessarie)

Grazie :)
Ciao :)
Usando le pipe per far comunicare i processi il problema si risolve senza accrocchi. ;)

pela
18-11-2006, 15:24
Così funziona, ma non ne capisco né il senso né il motivo.
Quando il figlio termina manda un segnale SIGCHLD al padre che fa una waitpid. Che senso ha aspettare un figlio se so che è già terminato?

( Dovrebbe essere il padre che pur disinteressandosi del figlio appena lo vede terminato stampa a video le informazioni necessarie)

grazie :)
Ciao :)
in realtà il padre non aspetta niente perché la wait che fai dentro l'handler ritorna subito (il while non serve)
la wait si fa comunque anche se il figlio è già terminato perché altrimenti il figlio rimane in stato zombie finché non termina anche il padre

beppegrillo
18-11-2006, 16:44
sai a cosa serve WNOHANG?
Rende la wait non bloccante, questo significa che non se ne frega di attendere se il figlio.
Tu la vuoi bloccante, leva quel parametro.

pavimento
19-11-2006, 09:20
Ciao,
invece la voglio proprio NON bloccante...
Se avessi potuto usare le pipe l'avrei fatto :P , ma mi è stato richiesto esplicitamente di non usarle :( .
Comunque ho risolto con la sigaction :)
grazie a tutti :)
ciao