Appels système

Fork System Call Linux

Fork System Call Linux

Appel du système de dérivation

L'appel système fork est utilisé pour créer un nouveau processus. Le processus nouvellement créé est le processus fils. Le processus qui appelle fork et crée un nouveau processus est le processus parent. Les processus fils et parents sont exécutés simultanément.

Mais les processus enfants et parents résident sur des espaces mémoire différents. Ces espaces mémoire ont le même contenu et quelle que soit l'opération effectuée par un processus n'affectera pas l'autre processus.

Lorsque le processus enfant est créé ; maintenant, les deux processus auront le même compteur de programme (PC), donc ces deux processus pointent vers la même instruction suivante. Les fichiers ouverts par le processus parent seront les mêmes pour le processus enfant.

Le processus enfant est exactement le même que son parent, mais il existe une différence dans les ID de processus :

  1. L'ID de processus du processus enfant est un ID de processus unique qui est différent des ID de tous les autres processus existants.
  2. L'ID de processus parent sera le même que celui de l'ID de processus du parent de l'enfant.

Propriétés du processus enfant

Voici quelques-unes des propriétés détenues par un processus enfant :

  1. Les compteurs CPU et les utilisations des ressources sont initialisés pour être remis à zéro.
  2. Lorsque le processus parent est terminé, les processus enfants ne reçoivent aucun signal car l'attribut PR_SET_PDEATHSIG dans prctl() est réinitialisé.
  3. Le thread utilisé pour appeler fork() crée le processus fils. Donc l'adresse du processus fils sera la même que celle du parent.
  4. Le descripteur de fichier du processus parent est hérité par le processus enfant. Par exemple, l'offset du fichier ou l'état des indicateurs et les attributs d'E/S seront partagés entre les descripteurs de fichiers des processus enfants et parents. Ainsi, le descripteur de fichier de la classe parent fera référence au même descripteur de fichier de la classe enfant.
  5. Les descripteurs de file d'attente de messages ouverts du processus parent sont hérités par le processus enfant. Par exemple si un descripteur de fichier contient un message dans le processus parent le même message sera présent dans le descripteur de fichier correspondant du processus enfant. Nous pouvons donc dire que les valeurs des drapeaux de ces descripteurs de fichiers sont les mêmes.
  6. De même, les flux de répertoires ouverts seront hérités par les processus enfants.
  7. La valeur par défaut de la marge de la minuterie de la classe enfant est la même que la valeur actuelle de la marge de la minuterie de la classe parent.

Propriétés qui ne sont pas héritées par le processus enfant

Voici quelques-unes des propriétés qui ne sont pas héritées par un processus enfant :

  1. Verrouillage de la mémoire
  2. Le signal en attente d'une classe enfant est vide.
  3. Traiter les verrous d'enregistrement associés (fcntl())
  4. Opérations d'E/S asynchrones et contenus d'E/S.
  5. Notifications de changement de répertoire.
  6. Les temporisateurs tels que alarm(), setitimer() ne sont pas hérités par la classe enfant.

fourche() en C

Il n'y a pas d'arguments dans fork() et le type de retour de fork() est un entier. Vous devez inclure les fichiers d'en-tête suivants lorsque fork() est utilisé :

#inclure
#inclure
#inclure

Lorsque vous travaillez avec fork(), peut être utilisé pour le type pid_t pour les ID de processus car pid_t est défini dans .

Le fichier d'en-tête est l'endroit où fork () est défini, vous devez donc l'inclure dans votre programme pour utiliser fork ().

Le type de retour est défini dans et l'appel fork() est défini dans . Par conséquent, vous devez inclure les deux dans votre programme pour utiliser l'appel système fork().

Syntaxe de fork()

La syntaxe de l'appel système fork() sous Linux, Ubuntu est la suivante :

pid_t fork(void);

Dans la syntaxe, le type de retour est pid_t. Lorsque le processus enfant est créé avec succès, le PID du processus enfant est retourné dans le processus parent et 0 sera retourné au processus enfant lui-même.

S'il y a une erreur, -1 est renvoyé au processus parent et le processus enfant n'est pas créé.

Aucun argument n'est passé à fork(). 

Exemple 1 : Appeler fork()

Considérons l'exemple suivant dans lequel nous avons utilisé l'appel système fork() pour créer un nouveau processus enfant :

CODE:

#inclure
#inclure
#inclure
int main()

fourchette();
printf("Utilisation de l'appel système fork()\n");
renvoie 0 ;

PRODUCTION:

Utiliser l'appel système fork()
Utiliser l'appel système fork()

Dans ce programme, nous avons utilisé fork(), cela créera un nouveau processus enfant. Lorsque le processus enfant est créé, le processus parent et le processus enfant pointent vers l'instruction suivante (même compteur de programme). De cette façon, les instructions ou instructions C restantes seront exécutées le nombre total de fois de processus, c'est-à-dire 2m fois, où n est le nombre d'appels système fork().

Ainsi, lorsque l'appel fork() est utilisé une fois comme ci-dessus (21 = 2) nous aurons notre sortie 2 fois.

Ici, lorsque l'appel système fork() est utilisé, la structure interne ressemblera à :

Considérons le cas suivant dans lequel le fork() est utilisé 4 fois :

CODE:

#inclure
#inclure
#inclure
int main()

fourchette();
fourchette();
fourchette();
fourchette();
printf("Utilisation de l'appel système fork()");
renvoie 0 ;

Production:

Utilisation de l'appel système fork() Utilisation de l'appel système fork() Utilisation de l'appel système fork() Utilisation de l'appel système fork() Utilisation de l'appel système fork() Utilisation de l'appel système fork() Utilisation de l'appel système fork() Utilisation de l'appel système fork() Utilisation de fork () appel système Utilisation de l'appel système fork() Utilisation de l'appel système fork() Utilisation de l'appel système fork() Utilisation de l'appel système fork() Utilisation de l'appel système fork() Utilisation de l'appel système fork() Utilisation de l'appel système fork() 

Maintenant, le nombre total de processus créés est de 24 = 16 et nous avons notre instruction print exécutée 16 fois.

Exemple 2 : Tester si fork() a réussi

Dans l'exemple suivant, nous avons utilisé la construction de prise de décision pour tester la valeur (int) renvoyée par fork(). Et les messages correspondants s'affichent :

CODE:

#inclure
#inclure
#inclure
int main()

pid_t p;
p = fourche();
si(p==-1)

printf("Il y a une erreur lors de l'appel de fork()");

si(p==0)

printf("Nous sommes dans le processus fils");

autre

printf("Nous sommes dans le processus parent");

renvoie 0 ;

PRODUCTION:

Nous sommes dans le processus parent
Nous sommes dans le processus enfant

Dans l'exemple ci-dessus, nous avons utilisé le type pid_t qui stockera la valeur de retour de fork(). fork() est appelé en ligne :

p = fourche();

Ainsi, la valeur entière renvoyée par fork() est stockée dans p puis p est comparée pour vérifier si notre appel fork() a réussi.

Lorsque l'appel fork() est utilisé et que l'enfant est créé avec succès, l'ID du processus enfant sera renvoyé au processus parent et 0 sera renvoyé au processus enfant.L'ID du processus enfant dans le processus parent ne sera pas le même que l'ID du processus enfant dans le processus enfant lui-même. Dans le processus enfant, l'ID du processus enfant sera 0.

Avec ce tutoriel, vous pouvez voir comment démarrer avec l'appel système fork sous Linux.

Meilleures applications de mappage de manette de jeu pour Linux
Si vous aimez jouer à des jeux sur Linux avec une manette de jeu au lieu d'un système de saisie clavier et souris typique, il existe des applications ...
Outils utiles pour les joueurs Linux
Si vous aimez jouer à des jeux sur Linux, il est probable que vous ayez utilisé des applications et des utilitaires comme Wine, Lutris et OBS Studio p...
Jeux HD remasterisés pour Linux qui n'ont jamais eu de version Linux plus tôt
De nombreux développeurs et éditeurs de jeux proposent une remasterisation HD d'anciens jeux pour prolonger la durée de vie de la franchise, veuillez ...