Fork (Unix) – Wikipedia

before-content-x4

Dans les systèmes d’exploitation Unixoid fourchette Le nom d’un appel système sur la base duquel le processus d’appel (processus parent) crée une copie de lui-même, un processus d’enfant si appelé. Le processus de l’enfant reprend les données, le code, le compteur de commande et le script de fichier du processus des parents et reçoivent son propre numéro de processus du noyau (comme le processus parent et tout autre processus), le PID (anglais “” P fusée IDENTIFIANT Hantier “).
En conséquence, le système d’exploitation gère le processus enfant comme une instance indépendante du programme et le mène indépendamment du processus des parents.

after-content-x4

Un processus d’enfant ne continue généralement pas à fonctionner exactement comme le processus parent, mais sélectionne d’autres chemins de code (autres instructions).

Sur la valeur de retour de fourchette() Il est reconnu dans quel processus vous êtes. Délivre fourchette() Un 0 dos, identifie le processus de l’enfant, dans le processus parental que le PID de l’enfant est remis. Délivre dans une erreur fourchette() Une valeur moins 0 et aucun processus enfant n’a été généré.

Le programme suivant est écrit en langage de programmation C et est destiné à montrer comment fonctionne une fourche. L’exemple de programme compte de 0 à 9 et produit la valeur du processus respectif et son ID de processus individuel.

#inclure   #inclure   #inclure   #inclure   int  principal  ()  {     int i, j;
   pid_t pid;

   pid = fork();

   if (pid == 0)
   {
      /* Kindprozess
       * wenn fork() eine 0 zurückgibt, befinden wir uns im Kindprozess
       */
      for (j=0; j < 10; j++)
      {
        printf ("Kindprozess:  %d (PID: %d)n", j, getpid());
        sleep (1);
      }
      exit (0);
   }
   else if (pid > 0)
   {
      /* Elternprozess
       * Gibt fork() einen Wert größer 0 zurück, befinden wir uns im Elternprozess
       * in pid steht die ID des Kindprozesses
       * getpid() gibt die eigene PID zurück
       */
      for (i=0; i < 10; i++)
      {
         printf ("Elternprozess: %d (PID: %d)n", i, getpid());
         sleep (1);
      }
   }
   else
   {
      /* Wird ein negativer Wert zurückgegeben, ist ein Fehler aufgetreten */
      fprintf (stderr, "Fehler");
      exit (1);
   }
   return 0;
}

Édition possible du programme:

Processus de l'enfant: 0 (PID: 11868)
Processus des parents: 0 (PID: 11867)
Processus de l'enfant: 1 (PID: 11868)
Processus parent: 1 (PID: 11867)
Processus de l'enfant: 2 (PID: 11868)
Processus parent: 2 (PID: 11867)
Processus de l'enfant: 3 (PID: 11868)
Processus des parents: 3 (PID: 11867)
Processus de l'enfant: 4 (PID: 11868)
Processus des parents: 4 (PID: 11867)
Processus de l'enfant: 5 (PID: 11868)
Processus des parents: 5 (PID: 11867)
Processus de l'enfant: 6 (PID: 11868)
Processus des parents: 6 (PID: 11867)
Processus de l'enfant: 7 (PID: 11868)
Processus des parents: 7 (PID: 11867)
Processus de l'enfant: 8 (PID: 11868)
Processus des parents: 8 (PID: 11867)
Processus de l'enfant: 9 (PID: 11868)
Processus des parents: 9 (PID: 11867) 

L’ordre des dépenses peut varier car le système d’exploitation décide quels processus sont effectués sur le processeur quand et pendant combien de temps (planification) en raison de divers critères. Entre autres choses, l’utilisation actuelle des ressources informatiques, des processus concurrents (programmes de système et d’application), le temps informatique déjà utilisé ou le temps d’attente doté jouent un rôle. À partir de ces informations, la priorité de chaque processus est toujours réévaluée. Les ID de processus émis sont réwis avec chaque programme et appel d’achat et ne sont donc que exemplaires.

Fork est également utilisé pour démarrer d’autres programmes (pas de copies du programme d’appel). À cette fin, selon la fourche de l’un des processus (généralement le processus de l’enfant), appelle une commande correspondante (par exemple EXECVE), qui remplace le processus d’appel par le programme souhaité. Un exemple: l’utilisateur a ouvert un shell et souhaite utiliser la commande LS Affichez le répertoire actuel. Alors il tape

LS 

un. Ce qui suit se produit (de manière simplifiée):

after-content-x4
  1. Le shell appelle fourchette() En conséquence, crée un nouveau processus enfant (une copie de vous-même) comme décrit ci-dessus.
  2. Le processus d’enfant nouvellement créé appelle désormais la commande execve (“/ bin / ls”) sur. En conséquence, le processus enfant se fait par le programme LS remplacé.
  3. Le nouvellement produit LS -Cring (qui est encore un enfant du shell) est exécuté.

L’utilisation de fourchette() il permet au processus de l’enfant avant d’appeler execve () Pour adapter vos scripts de fichier, par exemple, pour rediriger la sortie One (stdin, stdout, stderr). [d’abord]

  1. Andrew S. Tanenbaum: Systèmes d’exploitation modernes . Deuxième édition. ISBN 0-13-092641-8, S. 75

after-content-x4