Funzione wait in C
-
Utilizzare la funzione
wait
per attendere il cambiamento di stato nei processi figlio in C -
Utilizzare la funzione
waitpid
per attendere il cambiamento di stato in un processo figlio specifico in C
Questo articolo mostrerà diversi metodi su come utilizzare la funzione wait
in C.
Utilizzare la funzione wait
per attendere il cambiamento di stato nei processi figlio in C
La funzione wait
è un wrapper per la chiamata di sistema conforme a POSIX, definita nel file di intestazione <sys/wait.h>
. La funzione viene utilizzata per attendere i cambiamenti di stato del programma nei processi figli e recuperare le informazioni corrispondenti. wait
viene solitamente chiamato dopo la chiamata di sistema fork
che crea un nuovo processo figlio. La chiamata wait
sospende il programma chiamante fino al termine di uno dei suoi processi figli.
L’utente deve strutturare il codice in modo che siano presenti due percorsi diversi per un processo chiamante e per il processo figlio. Di solito si ottiene con l’istruzione if...else
che valuta il valore di ritorno della chiamata alla funzione fork
. Notare che fork
restituisce l’ID del processo figlio, un numero intero positivo, nel processo genitore e restituisce 0 nel processo figlio. fork
restituirà -1 se la chiamata fallisce.
#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);
}
Utilizzare la funzione waitpid
per attendere il cambiamento di stato in un processo figlio specifico in C
waitpid
è una versione leggermente migliorata della funzione wait
che fornisce la funzionalità per attendere il processo figlio specifico e modificare il comportamento di attivazione del ritorno. waitpid
può tornare se il processo figlio è stato interrotto o continuato in aggiunta al caso in cui il figlio è terminato.
Nell’esempio seguente, chiamiamo la funzione pause
dal processo figlio, che va a dormire finché non viene ricevuto il segnale. D’altra parte, il processo genitore chiama la funzione waitpid
e sospende l’esecuzione fino al ritorno del figlio. Utilizza anche le macro WIFEXITED
e WIFSIGNALED
per verificare se il bambino è terminato normalmente o terminato dal segnale, rispettivamente, e quindi stampa il messaggio di stato corrispondente sulla 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