2016-04-28 8 views

Antwort

1

Der allgemeine Ansatz wäre, waitpid() mit der WNOHANG Option zu verwenden. waitpid(pid, &status, WNOHANG) wartet auf einen unter pid angegebenen untergeordneten Prozess oder Prozessgruppe, um den Status zu ändern.

Ohne die Option WNOHANG blockiert die Funktion den aufrufenden Prozess, bis die Prozessgruppe den Status ändert. Einschließlich der Option wird sichergestellt, dass waitpid mit einem Wert von 0 zurückgegeben wird, wenn noch keine Kinder den Status geändert haben. (Die Funktion gibt pid, wenn der Zustand geändert hat.) Sie können für verschiedene Zustandsänderungen überprüfen, wie Kündigung, ein Stoppsignal zu kontrollieren, ein Wiederaufnahmesignal zu kontrollieren usw.

pid_t pid, w; 
int status; 

/* A call to fork, perhaps 
* (pid is set to child's) 
*/ 

/* Parent can check for child's termination */ 
w = waitpid(pid, &status, WNOHANG); 

if (w == -1) 
    handle_error("waitpid_error"); 

if (w == 0) 
    printf("child still running\n"); 
else 
    printf("child exited\n"); 

Beachten Sie, dass, wenn das Kind beendet, die Anruf an waitpid erntet das Kind.

+0

Aber das Problem mit dieser Idee ist, dass, wenn ich einen Prozess, den ich nicht sicher weiß, ob es Kinder hat oder nicht, die Verwendung von waitpid() und WNOHANG eines seiner Kinder beenden. Ich suche nach einer allgemeineren Lösung, die mir hilft, eine Antwort für jeden Prozess zu erhalten, ohne einen Teilprozess zu beenden. – CrazySynthax

+0

Ich bin mir nicht ganz sicher, was genau du machen willst. 'waitpid' beeinflusst keines der Zielprozesse in irgendeiner Weise (es sei denn, sie haben sich selbst beendet), es erhält nur Informationen über sie. Ich habe ein wenig gesucht und Sie könnten in '/ proc' schauen, wenn Sie auf einem Linux-System sind und nach möglichen Alternativen suchen. –

Verwandte Themen