wexitstatus - Come aspettare l'uscita di processi non figli




wait() library (5)

È possibile allegare al processo con ptrace(2) . Dalla shell, strace -p PID >/dev/null 2>&1 sembra funzionare. Questo evita l'attesa, anche se rallenterà il processo di tracciamento e non funzionerà su tutti i processi (solo il tuo, che è un po 'meglio dei soli processi figli).

Per i processi figli, le funzioni wait() e waitpid() possono essere utilizzate per sospendere l'esecuzione del processo corrente fino all'uscita di un figlio. Ma questa funzione non può essere utilizzata per processi non secondari.

Esiste un'altra funzione, che può attendere l'uscita di qualsiasi processo?


Finora ho trovato tre modi per farlo su Linux:

  • Polling: controlli l'esistenza del processo ogni tanto, usando kill o testando l'esistenza di /proc/$pid , come nella maggior parte delle altre risposte
  • Usa la chiamata di sistema ptrace per collegarti al processo come un debugger in modo da ricevere una notifica quando esce, come nella risposta di a3nm
  • Usa l'interfaccia netlink per ascoltare i messaggi PROC_EVENT_EXIT - in questo modo il kernel dice al tuo programma ogni volta che un processo termina e tu aspetti il ​​giusto ID del processo. Ho visto questo solo descritto in un posto su internet .

Plug spudorato: sto lavorando su un program (open source of course, GPLv2) che fa parte dei tre.


Nessuno ne sono a conoscenza. Oltre alla soluzione del caos, puoi usare i semafori se puoi cambiare il programma che vuoi aspettare.

Le funzioni della libreria sono sem_open(3) , sem_init(3), sem_wait(3), ...

sem_wait(3) esegue un'attesa, quindi non devi impegnarti ad aspettare come nella soluzione del caos. Ovviamente, l'uso dei semafori rende i programmi più complessi e potrebbe non valerne la pena.


Nulla di equivalente ad wait() . La pratica normale è quella di eseguire il poll utilizzando kill(pid, 0) e cercando il valore restituito -1 e errno di ESRCH per indicare che il processo è finito.


Su BSD e OS X, puoi usare kqueue con EVFILT_PROC + NOTE_EXIT per fare esattamente questo. Nessun sondaggio richiesto. Sfortunatamente non esiste un equivalente Linux.







wait