2015-11-03 12 views
6

Sono un po 'confuso. Come ho capito, waitpid con un pid di -1 significa che aspetto che tutto il bambino finisca, ma se aggiungo un'opzione al waitpid di WNOHANG, le opzioni dicono di uscire immediatamente se nessuno ha finito ... Queste sembrano estremamente confuse.waitpid, wnohang, wuntraced. Come faccio a usare questi

Perché dovrei dire al computer di aspettare che i processi figlio finiscano e poi subito dopo dirgli di uscire immediatamente se nessuno dei bambini ha finito?

Qualcuno può spiegare questa opzione e le opzioni WUNTRACED? Non so cosa significhi essere rintracciati.

+0

pid = -1 significa attendere * qualsiasi * bambino, non tutti. E "wait" è un termine tecnico, che si riferisce a "wait (2)". – melpomene

+0

@melpomene Ah, sì, tutti sono molto diversi. Grazie per la correzione. Diciamo che ho 3 figli ... come fa il computer a determinare quale aspettare? O è un primo tipo di cosa in cui, se uno dei bambini finisce, il computer ha tecnicamente aspettato e si è mosso? – 8this

+0

@ 8questo Se passi un pid di '-1', non aspetta che finiscano tutti * i bambini *, aspetta che * qualsiasi * bambino finisca. Una volta che un bambino ha finito, viene raccolto. – fuz

risposta

2

Se superi -1 e WNOHANG, waitpid() controllerà se esistono bambini zombi. Se sì, uno di questi viene raccolto e viene restituito lo stato di uscita. In caso contrario, viene restituito 0 (se esistono bambini non terminati) o -1 viene restituito (se non) e ERRNO è impostato su ECHILD (Nessun processo figlio). Questo è utile se vuoi scoprire se qualcuno dei tuoi figli è morto di recente senza dover aspettare che uno di loro muoia. È piuttosto utile in questo senso.

L'opzione WUNTRACED è documentato come sotto, non ho nulla da aggiungere a questa descrizione:

WUNTRACED   Lo stato di tutti i processi figlio specificati da pid che vengono arrestati, e il cui status non è ancora stato segnalato poiché si sono fermati, devono essere segnalati anche al processo di richiesta.

Leggere la pagina waitpid da POSIX per ulteriori dettagli.

13

In genere si utilizzano WNOHANG e WUNTRACED in diversi casi.

Caso 1: Supponiamo di avere un processo che genera un gruppo di bambini e deve fare altre cose mentre i bambini sono in esecuzione. Questi bambini a volte escono o vengono uccisi, ma il kernel manterrà il loro stato di uscita fino a quando alcuni altri processi lo richiederanno tramite wait() o waitpid(). Quindi, il tuo processo genitore deve chiamare a volte wait()/waitpid() per consentire al kernel di liberarsi dei resti del figlio. Ma non vogliamo wait()/waitpid() al blocco , perché, in questo caso, il nostro processo ha altre cose che deve fare. Vogliamo solo raccogliere lo stato di un processo morto se ce ne sono. Ecco a cosa serve WNOHANG. Impedisce il blocco di wait()/waitpid() in modo che il processo possa continuare con altre attività. Se un bambino muore, il suo pid sarà restituito da wait()/waitpid() e il tuo processo può agire in tal senso. Se nulla è morto, il pid restituito è 0.

Caso 2: supponiamo che il processo padre, invece, desideri fare nulla mentre i bambini sono in esecuzione. Non vuoi semplicemente fare un po 'di thumb-twidling for-loop, quindi usi un normale wait()/waitpid() senza WNOHANG. Il tuo processo viene estratto dalla coda di esecuzione fino a quando uno dei bambini muore. Ma cosa succede se uno dei tuoi figli è fermato tramite un SIGSTOP? Il tuo bambino non lavora più sull'attività a cui l'hai impostato, ma il genitore sta ancora aspettando. Quindi, in un certo senso, hai un punto morto, a meno che il bambino non venga continuato in qualche modo esterno al genitore e al bambino. WUNTRACED consente al genitore di essere restituito da wait()/waitpid() se un figlio diventa interrotto oltre a uscire o essere ucciso. In questo modo, il tuo genitore ha la possibilità di inviarlo a SIGCONT per continuare, ucciderlo, assegnare le sue attività a un altro bambino, qualunque sia.

Problemi correlati