TD 12: Tubes

Tristan Crolard - François Pottier

Rappelons que les sujets et corrigés de chaque TD sont accessibles sur les machines des élèves, dans ~pottier/TD-Systems-98-99/. Essayez les programmes, modifiez-les, exécutez-les pas-à-pas, etc. pour mieux comprendre leur fonctionnement.

Gestion de processus

fork

La création d'un nouveau processus se fait à l'aide de l'appel système fork. Celui-ci duplique le processus courant, pour créer un processus fils identique. Celui-ci hérite, en particulier, de tous les descripteurs de fichiers ouverts par son père, ce qui permet aux deux processus de partager un tube anonyme.

        #include <sys/types.h>
        #include <unistd.h>
        pid_t fork (void);
La fonction fork renvoie -1 en cas d'erreur. En cas de succès, elle renvoie 0 au processus fils, et l'identificateur (process ID) du processus nouvellement créé au processus père. Cela permet à chacun de savoir s'il est le père ou le fils, puisqu'ils sont par ailleurs identiques!

exec

L'appel fork permet de dupliquer un processus à l'identique. Elle est complétée par un autre appel - en fait une famille d'appels, collectivement appelée exec - qui permet à un processus de lire un fichier exécutable et de lui passer le contrôle. Il n'y a pas, ici, création d'un nouveau processus: le processus reste le même, au sens où il conserve son identificateur (process ID), ses descripteurs de fichiers ouverts, etc. Cependant, son état mémoire (code, pile, tas) est perdu et remplacé par celui du nouvel exécutable.

        #include <unistd.h>
        int execvp (const char* file, const char** argv);
La fonction execvp demande le nom du programme (qu'elle cherche dans le PATH si nécessaire), suivi d'un vecteur d'arguments, dont le premier doit être le nom court du programme et le dernier NULL. Elle renvoie -1 en cas d'échec et 0 en cas de succès.

Exercice 1

On se propose de réécrire la commande tube (du TD 10) :

usage: tube commande1 commande2
permettant de simuler:
       commande1 | commande2
1.
Écrire les fonctions nbargs et decoupe dont les propotypes sont les suivants :
int nbargs(const char *commande) 
char **decoupe(const char *commande)
permettant de preparer les arguments pour execvp à partir d'une chaine de caractères (on pourra utiliser la fonction strtok de la librairie standard).
2.
Écrire la commande tube.

Exercice 2

Nous allons maintenant généraliser la commande mtube à m arguments.

usage: mtube commande_1 ... commande_m
permettant de simuler:
       commande_1 | ... | commande_m
Par exemple, on tapera:
       mtube "ls -l" "grep ens" "more"
au lieu de:
      ls -l | grep ens | more

1.
Donner une implantation itérative de mtube.
2.
Donner une implantation récursive de mtube.


Jean-Baptiste Yunes
1999-03-08