Utilizzare la funzione fork in C

Jinku Hu 12 ottobre 2023
  1. Usa la funzione fork per creare un nuovo processo in C
  2. Utilizzare una delle funzioni exec per eseguire un nuovo programma nel processo figlio in C
Utilizzare la funzione fork in C

Questo articolo spiegherà diversi metodi su come utilizzare la funzione fork in C.

Usa la funzione fork per creare un nuovo processo in C

La funzione fork viene utilizzata per creare un nuovo processo che rappresenta la duplicazione del processo chiamante. Notare che il processo chiamante è convenzionalmente chiamato processo genitore e uno appena creato - processo figlio. Anche se abbiamo menzionato sopra che il processo figlio è un duplicato del genitore, ci sono alcune differenze come il processo figlio ha il suo PID univoco (i dettagli completi sulle differenze sono elencati nel manuale fork pagina).

Nell’esempio seguente, implementiamo uno scenario semplice in cui fork viene utilizzato per eseguire due processi contemporaneamente. La prima istruzione if controlla se viene restituito un codice di errore e continua solo se il fork ha avuto successo. La successiva istruzione if mostra come strutturare il codice che deve essere eseguito da processi simultanei.

La chiamata fork è un po’ unica rispetto ad altre funzioni in quanto restituisce due volte quando ha successo - nel processo genitore e nel figlio - restituendo il PID del processo figlio nel genitore e il valore 0 nel figlio. Si noti che specifichiamo le condizioni del bucle di conseguenza per distinguere diversi percorsi di codice per i processi.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/wait.h>
#include <unistd.h>

int main(void) {
  pid_t c_pid = fork();
  if (c_pid == -1) {
    perror("fork");
    exit(EXIT_FAILURE);
  }

  if (c_pid == 0) {
    printf("printed from child process - %d\n", getpid());
    exit(EXIT_SUCCESS);
  } else {
    printf("printed from parent process - %d\n", getpid());
    wait(NULL);
  }

  exit(EXIT_SUCCESS);
}

Produzione:

printed from parent process - 8485
printed from child process - 8486

Utilizzare una delle funzioni exec per eseguire un nuovo programma nel processo figlio in C

Uno dei casi comuni per l’utilizzo della funzione fork è l’esecuzione di un nuovo programma nel processo figlio, che può essere ottenuto aggiungendo una delle funzioni exec al mix. In questo caso, abbiamo implementato una funzione separata chiamata spawnChild che crea un nuovo processo e quindi chiama execvp per eseguire il programma dato. Abbiamo scelto un programma a riga di comando ampiamente disponibile - top da eseguire nel processo figlio. Nota che il processo genitore può scegliere di aspettare che lo stato del processo figlio cambi usando waitpid.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/wait.h>
#include <unistd.h>

pid_t spawnChild(const char* program, char** arg_list) {
  pid_t ch_pid = fork();
  if (ch_pid == -1) {
    perror("fork");
    exit(EXIT_FAILURE);
  }

  if (ch_pid == 0) {
    execvp(program, arg_list);
    perror("execve");
    exit(EXIT_FAILURE);
  } else {
    printf("spawned child with pid - %d\n", ch_pid);
    return ch_pid;
  }
}

int main(void) {
  int ret;
  const char* args[] = {"top", NULL, NULL};

  pid_t child;
  int wstatus;

  child = spawnChild("top", args);

  if (waitpid(child, &wstatus, WUNTRACED | WCONTINUED) == -1) {
    perror("waitpid");
    exit(EXIT_FAILURE);
  }

  exit(EXIT_SUCCESS);
}

Produzione:

printed from child process - 8486
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