Funzione wait in C

Jinku Hu 12 ottobre 2023
  1. Utilizzare la funzione wait per attendere il cambiamento di stato nei processi figlio in C
  2. Utilizzare la funzione waitpid per attendere il cambiamento di stato in un processo figlio specifico in C
Funzione wait 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);
}
Autore: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

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

Articolo correlato - C Process