Utiliser la fonction fork en C
-
Utiliser la fonction
fork
pour créer un nouveau processus en C -
Utiliser une des fonctions
exec
pour exécuter un nouveau programme dans le processus enfant en C
Cet article explique plusieurs méthodes d’utilisation de la fonction fork
en C.
Utiliser la fonction fork
pour créer un nouveau processus en C
La fonction fork
est utilisée pour créer un nouveau processus représentant la duplication du processus de l’appelant. Notez que le processus appelant est traditionnellement appelé processus parent et un processus nouvellement créé - un processus enfant. Bien que nous ayons mentionné ci-dessus que le processus enfant est un double du processus parent, il existe certaines différences, comme le fait que le processus enfant a son propre PID unique (tous les détails sur les différences sont énumérés dans le manuel de fork
page).
Dans l’exemple suivant, nous mettons en œuvre un scénario simple dans lequel fork
est utilisée pour exécuter deux processus simultanément. La première déclaration if
vérifie si un code d’erreur est renvoyé et ne continue que si le fork
a réussi. L’instruction if
suivante montre comment structurer le code à exécuter par les processus concurrents.
L’appel fork
est un peu unique comparé à d’autres fonctions car il retourne deux fois en cas de succès - dans le processus parent et dans le processus enfant - renvoyant le PID du processus enfant dans le parent et la valeur 0
dans le fils. Notez que nous spécifions les conditions de la boucle en conséquence pour distinguer les différents chemins de code des processus.
#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);
}
Production :
printed from parent process - 8485
printed from child process - 8486
Utiliser une des fonctions exec
pour exécuter un nouveau programme dans le processus enfant en C
L’un des cas les plus courants d’utilisation de la fonction fork
est l’exécution d’un nouveau programme dans le processus enfant, ce qui peut être réalisé en ajoutant une des fonctions exec
au mélange. Dans ce cas, nous avons implémenté une fonction séparée appelée spawnChild
qui crée un nouveau processus et appelle ensuite execvp
pour exécuter le programme donné. Nous avons choisi un programme en ligne de commande largement disponible - top
pour l’exécuter dans le processus enfant. Notez que le processus parent peut choisir d’attendre les changements d’état du processus fils en utilisant 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);
}
Production :
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