wait Fonction en C
-
Utiliser la fonction
wait
pour attendre un changement d’état dans les processus de l’enfant en C -
Utilisez la fonction
waitpid
pour attendre un changement d’état dans un processus enfant spécifique en C
Cet article présente plusieurs méthodes pour utiliser la fonction wait
en C.
Utiliser la fonction wait
pour attendre un changement d’état dans les processus de l’enfant en C
La fonction wait
est un wrapper pour les appels système compatibles POSIX, défini dans le fichier d’en-tête <sys/wait.h>
. La fonction est utilisée pour attendre les changements d’état du programme dans les processus enfants et récupérer les informations correspondantes. La fonction wait
est généralement appelée après l’appel système fork
qui crée un nouveau processus fils. L’appel wait
suspend le programme appelant jusqu’à ce que l’un de ses processus fils se termine.
L’utilisateur doit structurer le code de manière à ce qu’il y ait deux chemins différents pour un processus appelant et le processus fils. Cela se fait généralement avec l’instruction if...else
qui évalue la valeur de retour de l’appel de fonction fork
. Notez que fork
renvoie l’ID du processus fils, un entier positif, dans le processus parent et renvoie 0 dans le processus fils. Fork retournera -1 si l’appel échoue.
#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);
}
Utilisez la fonction waitpid
pour attendre un changement d’état dans un processus enfant spécifique en C
La fonction waitpid
est une version légèrement améliorée de la fonction wait
qui permet d’attendre le processus enfant spécifique et de modifier le comportement de déclenchement du retour. waitpid
peut revenir si le processus enfant a été arrêté ou poursuivi, en plus du cas où l’enfant est terminé.
Dans l’exemple suivant, nous appelons la fonction pause
du processus enfant, qui se met en veille jusqu’à ce que le signal soit reçu. D’autre part, le processus parent appelle la fonction waitpid
et suspend l’exécution jusqu’au retour de l’enfant. Il utilise également les macros WIFEXITED
et WIFSIGNALED
pour vérifier si l’enfant est terminé normalement ou terminé par le signal, respectivement, puis imprime le message d’état correspondant sur la console.
#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