Ich suche nach einer C-Funktion, die ein pgid (Prozessgruppen-ID) akzeptiert und gibt zurück, ob diese Prozessgruppe ausgeführt oder gestoppt wird.Eine Funktion, die eine PID akzeptiert und ihren Modus zurückgibt
Antwort
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.
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
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. –