Utilizzare la funzione fork in C
-
Usa la funzione
fork
per creare un nuovo processo in C -
Utilizzare una delle funzioni
exec
per eseguire un nuovo programma nel processo figlio 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
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