wait Funktion in C
-
Verwendung der
wait
-Funktion zum Warten auf Zustandsänderungen in Child-Prozessen in C -
Verwenden Sie die Funktion
waitpid
, um auf eine Zustandsänderung in einem bestimmten Kindprozess in C zu warten
In diesem Artikel werden mehrere Methoden zur Verwendung der Funktion wait
in C vorgestellt.
Verwendung der wait
-Funktion zum Warten auf Zustandsänderungen in Child-Prozessen in C
Die Funktion wait
ist ein Wrapper für einen POSIX-kompatiblen Systemaufruf, der in der Header-Datei <sys/wait.h>
definiert ist. Die Funktion wird verwendet, um auf Programmzustandsänderungen in Kindprozessen zu warten und die entsprechenden Informationen abzurufen. wait
wird normalerweise nach dem Systemaufruf fork
aufgerufen, der einen neuen Kindprozess erzeugt. Der Aufruf von wait
hält das aufrufende Programm an, bis einer seiner Kindprozesse beendet ist.
Der Anwender sollte den Code so strukturieren, dass es zwei verschiedene Pfade für einen aufrufenden Prozess und den Kindprozess gibt. Dies wird normalerweise mit der if...else
-Anweisung erreicht, die den Rückgabewert des fork
-Funktionsaufrufs auswertet. Beachten Sie, dass fork
im Elternprozess die ID des Kindprozesses, eine positive Ganzzahl, zurückgibt und im Kindprozess 0 zurückgibt. Wenn der Aufruf fehlschlägt, gibt fork
-1 zurück.
#include <stdio.h>
#include <stdlib.h>
#include <sys/wait.h>
#include <unistd.h>
int main() {
pid_t c_pid = fork();
if (c_pid == -1) {
perror("fork");
exit(EXIT_FAILURE);
}
if (c_pid == 0) {
printf("printed from child process %d", getpid());
exit(EXIT_SUCCESS);
} else {
printf("printed from parent process %d\n", getpid());
wait(NULL);
}
exit(EXIT_SUCCESS);
}
Verwenden Sie die Funktion waitpid
, um auf eine Zustandsänderung in einem bestimmten Kindprozess in C zu warten
waitpid
ist eine leicht erweiterte Version der Funktion wait
, die die Möglichkeit bietet, auf einen bestimmten Kindprozess zu warten und das Rückgabeverhalten zu ändern. waitpid
kann zusätzlich zu dem Fall, dass der Kindprozess beendet wird, auch zurückgeben, wenn der Kindprozess angehalten oder fortgesetzt wurde.
Im folgenden Beispiel rufen wir die Funktion pause
vom Kindprozess auf, der in den Ruhezustand geht, bis das Signal empfangen wird. Auf der anderen Seite ruft der Elternprozess die Funktion waitpid
auf und setzt die Ausführung aus, bis der Kindprozess zurückkehrt. Außerdem werden die Makros WIFEXITED
und WIFSIGNALED
verwendet, um zu prüfen, ob der Kindprozess normal oder durch ein Signal beendet wurde, und dann die entsprechende Statusmeldung auf der Konsole auszugeben.
#include <stdio.h>
#include <stdlib.h>
#include <sys/wait.h>
#include <unistd.h>
int main() {
pid_t child_pid, wtr;
int wstatus;
child_pid = fork();
if (child_pid == -1) {
perror("fork");
exit(EXIT_FAILURE);
}
if (child_pid == 0) {
printf("Child PID is %d\n", getpid());
pause();
_exit(EXIT_FAILURE);
} else {
wtr = waitpid(child_pid, &wstatus, WUNTRACED | WCONTINUED);
if (wtr == -1) {
perror("waitpid");
exit(EXIT_FAILURE);
}
if (WIFEXITED(wstatus)) {
printf("exited, status=%d\n", WEXITSTATUS(wstatus));
} else if (WIFSIGNALED(wstatus)) {
printf("killed by signal %d\n", WTERMSIG(wstatus));
}
}
exit(EXIT_SUCCESS);
}
Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.
LinkedIn Facebook