|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Member
Iscritto dal: Mar 2005
Messaggi: 41
|
[C]waitpid
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 ![]() |
![]() |
![]() |
![]() |
#2 |
Member
Iscritto dal: Jul 2003
Città: pisa
Messaggi: 141
|
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
|
![]() |
![]() |
![]() |
#3 |
Senior Member
Iscritto dal: Mar 2004
Messaggi: 16053
|
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. ![]() |
![]() |
![]() |
![]() |
#4 |
Member
Iscritto dal: Mar 2005
Messaggi: 41
|
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 ![]() |
![]() |
![]() |
![]() |
#5 | |
Senior Member
Iscritto dal: Mar 2004
Messaggi: 16053
|
Quote:
![]() |
|
![]() |
![]() |
![]() |
#6 | |
Member
Iscritto dal: Jul 2003
Città: pisa
Messaggi: 141
|
Quote:
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 |
|
![]() |
![]() |
![]() |
#7 |
Senior Member
Iscritto dal: Mar 2004
Messaggi: 1451
|
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.
__________________
Ciao ~ZeRO sTrEsS~ |
![]() |
![]() |
![]() |
#8 |
Member
Iscritto dal: Mar 2005
Messaggi: 41
|
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 |
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 06:48.