next up previous contents index
suivant: 7. Communications inter-processus monter: 6. Les processus précédent: 6.2 Création de processus   Table des matières   Index

Sous-sections

6.3 Manipulation de processus en langage C

Examinons maintenant les appels systèmes à utiliser pour créer un nouveau processus.


6.3.1 La primitive fork()

  #include <unistd.h>
  int fork();

L'appel à fork() duplique le processus. L'exécution continue dans les deux processus après l'appel à fork(). Tout se passe comme si les deux processus avaient appelé fork(). La seule différence (outre le PID et le PPID) est la valeur retournée par fork() :

Notons que le fork peut échouer par manque de mémoire ou si l'utilisateur a déja créé trop de processus; dans ce cas, aucun fils n'est créé et fork() retourne -1.

Un exemple de programme appelant fork() est donné page [*].


Tableau 6.1: Exemple d'appel de la primitive fork().
\begin{table}
\begin{verbatim}/* Exemple utilisation primitive fork() sous UNIX
...
... de la fin du fils */
printf(''Fin du pere.\n'');
}
}\end{verbatim}\end{table}


6.3.2 Les primitives getpid() et getppid()

L'appel système getpid() retourne le PID du processus appelant. getppid() retourne le PID du père du processus.


6.3.3 La primitive exec()

La primitive execlp() permet le recouvrement d'un processus par un autre exécutable (voir 6.2).
   int execlp( char *comm, char *arg, ..., NULL );
comm est une chaîne de caractères qui indique la commande à exécuter. arg spécifie les arguments de cette commande (argv).

Exemple : exécution de ls -l /usr

   execlp( "ls",  "ls", "-l", "/usr", NULL );

Notons que la fonction execlp() retourne -1 en cas d'erreur. Si l'opération se passe normalement, execlp() ne retourne jamais puisque qu'elle détruit (remplace) le code du programme appelant.


6.3.4 La primitive exit()

exit() est une autre fonction qui ne retourne jamais, puisqu'elle termine le processus qui l'appelle.
   #include <stdlib.h>
   void exit(int status);
L'argument status est un entier qui permet d'indiquer au shell (ou au père de façon générale) qu'une erreur s'est produite. On le laisse à zéro pour indiquer une fin normale.


6.3.5 La primitive wait()

   #include <sys/types.h>
   #include <sys/wait.h>
   int wait( int *st );

L'appel wait() permet à un processus d'attendre la fin de l'un de ses fils. Si le processus n'a pas de fils ou si une erreur se produit, wait() retourne -1. Sinon, wait() bloque jusqu'à la fin de l'un des fils, et elle retourne son PID.

L'argument st doit être nul.


6.3.6 La primitive sleep()

   #include <unistd.h>
   int sleep( int seconds );
L'appel sleep() est similaire à la commande shell sleep. Le processus qui appelle sleep est bloqué durant le nombre de secondes spécifié, sauf s'il reçoit entre temps un signal.

Notons que l'effet de sleep() est très différent de celui de wait() : wait bloque jusqu'à ce qu'une condition précise soit vérifiée (la mort d'un fils), alors que sleep attend pendant une durée fixée. sleep ne doit jamais être utilisé pour tenter de synchroniser deux processus.


next up previous contents index
suivant: 7. Communications inter-processus monter: 6. Les processus précédent: 6.2 Création de processus   Table des matières   Index
Emmanuel Viennet
1999-01-05