Un tube est un mécanisme de communication unidirectionnel permettant le transfert d'un flot continu de caractères. Il est géré comme une file FIFO : les caractères sont lus dans l'ordre dans lequel ils ont été écrits dans le tube.

Le but de ce TP est d'étudier la communication inter-processus par tubes (en langage C).

Aide

La création d'un tube anonyme se fait à l'aide de la primitive pipe :

#include ‹unistd.h›

int pipe(int p[2]);

qui retourne dans le tableau p passé en paramètre les descripteurs à utiliser pour accéder au tube. p[0] contient le descripteur pour la lecture et p[1] celui pour l'écriture.
La fonction retourne en entier, 0 si la fonction a réussi, -1 sinon. Dans ce cas, la variable errno indique l’erreur :

  • EMFILE : trop de descripteur sont actifs.
  • ENFILE : la table du système de fichiers est pleine.
  • EFAULT : les descripteurs de fichiers sont dans une zone non gérée par le processus.


La lecture se fait grâce à la primitive read dont la syntaxe est

int read(int p[0],void * buf, int nb_car);

nb_car étant le nombre de caractères que l'on souhaite lire à partir du tube et buf un pointeur sur une zone mémoire dans laquelle ils seront rangés après lecture. Cette primitive retourne le nombre de caractères effectivement lus.


L'écriture dans un tube se fait à l'aide de la primitive write dont la syntaxe est

write(int p[1],void * buf, int nb_car);

nb_car est le nombre de caractères que l'on souhaite écrire dans le tube et buf un pointeur sur la zone contenant les caractères à écrire.

top

Exercice 1 - Hello World !

Écrire un programme C qui crée une bifurcation et utilise un tube pour envoyer la chaîne de caractère "Hello World!" du processus fils vers le processus père.

top

Exercice 2 - Communications inter-processus

  1. Écrire un programme C qui crée deux processus communiquant par tube de communication. Le processus producteur (lecture de l'entrée standard et écriture dans un tube) et un processus consommateur qui met en majuscule les minuscules (lecture du tube et écriture sur la sortie standard).

  2. Écrire un programme C qui crée deux processus communiquant par tube de communication. Le processus producteur ouvre un fichier donné en argument du programme et transmet le contenu de ce fichier au processus consommateur via un tube de communication. Ce processus écrit le contenu du tube dans le deuxième fichier passé en argument.

top

Exercice 3 - ls -al | wc -l

Écrire un programme C qui réalise la commande ls -al | wc -l en créant deux processus qui communiquent à travers un tube. Le fils écrit dans le tube en ayant au préalable redirigé sa sortie standard à travers un tube ; quant au père il lit dans le tube en ayant au préalable redirigé son entrée standard vers le tube.

Pour la redirection de la sortie et de l'entrée standard, utiliser la fonction dup.
Utiliser la primitive de recouvrement execlp pour faire exécuter au fils et au père les commandes ls et wc.

top

Exercice 4 - Crible d'Eratosthene

Le but de cet exercice est d'implanter le crible d'Erathosthene comme test de primalité d'un entier rationnel (il existe bien évidemment des tests de primalité plus efficaces).

L'un des problèmes de l'exercice 4 d'un TP précédent a été le grand nombre de processus qui ont été nécessaires. Par conséquent, nous allons maintenant permettre à chaque processus de tester jusqu'à 20 nombres premiers mais nous ne pouvons plus utiliser la la valeur de retour exit pour retourner les facteurs premiers trouvés.

  1. Dans cette question, le processus fera parvenir les facteurs premiers trouvés (le cas échéant) au processus père en utilisant les canaux de communication fournis par un tube

  2. Pour un problème de calcul distribué plus réaliste, la complexité des processus peut prendre plus de quelques millisecondes.
    Dans un tel cas, le processus père ne doit pas attendre les résultats d'un calcul lent lorsque d'autres résultats sont prêts.

    Utiliser la fonction select afin que les résultats soient lus dès qu'ils sont disponibles. Chaque processus devrait faire savoir au processus père quand il est fini son travail afin celui-ci puisse fermer le tube correspondant.
    Introduire une durée de cinq secondes de retard dans le processus de traitement de la première série de nombres premiers et vérifier que le programme ne bloque pas dans l'attente de la première série de résultats.

top