Ho capito che: 1) waitpid è usato per attendere la morte di un bambino e quindi raccogliere il SIGCHLD e lo stato di uscita del bambino ecc. 2) Quando abbiamo un gestore di segnale per SIGCHLD, facciamo ancora alcune cose in relazione alla pulizia del bambino o di altre cose (fino al programmatore) e poi fare un waitpid in modo che il bambino non vada a zombi e poi ritorni.Utilizzo di waitpid o sigaction?
Ora, abbiamo bisogno di avere entrambi 1 e 2 nei nostri programmi quando facciamo un fork/exec e il bambino ritorna? Se abbiamo entrambi, il SIGCHLD è ottenuto prima, in modo che il gestore di segnale viene chiamato prima e quindi la sua waitpid si chiama con successo e non il waitpid nel codice processo padre come segue:
my_signal_handler_for_sigchld
{
do something
tmp = waitpid(-1,NULL,0);
print tmp (which is the correct value of the child pid)
}
int main()
{
sigaction(SIGCHLD, my_signal_handler_for_sigchld)
fork()
if (child) //do something, return
if parent // waitpid(child_pid, NULL,0); print value returned from this waitpid - it is -1
}
grato se qualcuno mi aiuta capisci questo.
Ciao, grazie per la risposta.Ma quello che stavo veramente cercando è: quando ho sig_handler e waitpid nel processo genitore, il sig_handler è chiamato becaues di sigchld e quindi il secondo waitpid come mostrato sopra nella mia domanda restituisce -1. Quindi posso semplicemente rimuovere il secondo waitpid che sto avendo? – Vin
Sì, è possibile solo attendere una volta un determinato processo figlio. In realtà è un bug da attendere di nuovo poiché il pid è "liberato" dalla prima attesa e potrebbe essere stato riutilizzato per un nuovo processo figlio (se ne è stato creato un altro). –
@R .. Potremmo chiarire il 'Quando il processo figlio termina, la sua estremità del tubo sarà chiusa un po '? Per essere veramente precisi, non sarebbe 'Quando il processo figlio chiude il suo FD che è connesso alla fine del tubo, e non ci sono altri processi con FD collegati a quella estremità del tubo, allora l'altra estremità del tubo sarà segnalato come chiuso (riceve EOF) '? Credo che spiegherebbe più precisamente cosa succede, e anche l'importante caso speciale di ciò che accade se più di 2 processi con FD a una pipe aperta. – nh2