Sahid Ferdjaoui Blog - Funraill Foundation Bienvenue, Log in - thème 2007 RC1

Powered by OpenSource Softwares

Outil de déboggage colaborative
reduire

Processus et GlibC

le 5 juin 2007 par sahid



Les processus en C via la GlibC

Les processus

Un processus est une tâche en cours d’exécution sur son systÚme, elle comporte des données ainsi que du code. Un processus peut avoir plusieurs états et peut comuniquer avec d’autres processus. Wikipedia pour en savoir +

Notions importantes

  • Entêtes unistd.h, stdlib.h
  • Un processus est identifié via un identifiant unique on parle de PID Process IDentifier
  • Tout processus a un pÚre, on parle de PPID Parent Process IDentifier. Seul le processus init est orphelin (cat /proc/1/status).
  • ps

Cas concret

Un serveur et ses clients. A chaque nouvelle connexion d’un client sur le serveur, celui-ci déclenche un nouveau processus, ainsi chaque client dispose de ses propres propriétés et fonctionnalités.

Les routines

Un processus est déclenché via l’appel-systÚme fork(), il duplique le processus appellant et retourne l’identifiant du processus créée du cÎté appelant et 0 du cÎté fils.
En cas de problÚme fork() retourne la valeur -1 et remplit la variable globale errno.

  1. pid_t fork ();

Via leurs identifiants, on pourra faire exécuter au processus un bout de code différent, exemple le processus parent écoute les nouvelles connexions clientes et génÚre les processus fils qui s’ocupperont du traitement client.

Pour ça on dipose des routines suivantes :

  1. pid_t getpid (); /* retourne le PID du processus appelant */
  1. pid_t getppid (); /* Retourne le PPID du processus appelant */

Un exemple

Source

  1. #include <stdio.h>
  2. #include <unistd.h>
  3. #include <stdlib.h>
  4.  
  5. int
  6. main (int argc, char *argv[])
  7. {
  8.   pid_t pid;
  9.  
  10.   pid = fork ();
  11.   if (pid == -1)
  12.     {
  13.       fprintf (stderr, “Erreur! : fork() - errno=%d\n, errno);
  14.       return 1;
  15.     }
  16.  
  17.   if (pid != 0) /* proc pÚre */
  18.     {
  19.       fprintf (stdout, “Proc PÚre :\n\tPPID=%d, PID=%d\n,
  20.                getppid (), getpid ());
  21.       wait (NULL); /* attend que le proc fils termine */
  22.  
  23.       return 0; /* termine la tâche */
  24.     }
  25.   else /* proc fils */
  26.     {
  27.       fprintf (stdout, “Proc Fils : \n\tPPID=%d, PID=%d\n,
  28.                getppid (), getpid ());
  29.     }
  30.   return 0;
  31. }

Résultat

  1. sahid@master-deb:~/Desktop$ ./a.out
  2. Proc Fils :
  3.         PPID=3261, PID=3262
  4. Proc PÚre :
  5.         PPID=2818, PID=3261
  6. sahid@master-deb:~/Desktop$ ps
  7.   PID TTY          TIME CMD
  8.  2818 pts/0    00:00:00 bash
  9.  2843 pts/0    00:00:09 emacs
  10.  3263 pts/0    00:00:00 ps
  11. sahid@master-deb:~/Desktop$

Tu peux laisser un commentaire pour Processus et GlibC