Programmation Système et Réseau
TP n° 2




Notions abordées :


Exercice 1.


Exécuter le programme suivant. Que se passe-t-il ? Pourquoi ? Comment y remédier ?

#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>

int main ( void )
{
printf ( "Bonjour " ) ;
if ( fork ( ) )
printf ( "Monsieur\n" ) ;
else
printf ( "Madame\n" ) ;
return 0 ;
}


Exercice 2.

Ecrire un programme ayant la syntaxe suivante:

matproc n  m

L'action de ce programme doit être de générer n processus, chacun d'entre eux devant générer n processus à son tour et ainsi de suite juqu'à m niveaux. Combien de processus sont générés au total ?


Exercice 3.

On désire connaître la capacité d'un tube. Pour cela, on propose d'envoyer des données, en les comptant, dans un tube qu'aucun lecteur ne consulte (ouvert en lecture, mais jamais lu par un processus). Au bout d'un certain nombre d'octets, l'écrivain se bloque en attendant que le tube se vide.


Exercice 4.

    On se propose d'écrire un programme qui liste les n premiers nombres premiers. Pour cela on choisit d'implanter l'algorithme du crible d'Eratosthène.
    Ecrire un programme qui crée n processus, le premier passe au second tous les nombres entiers de 2 à , le second affiche le premier nombre reçu (i.e. le nombre 2) sur la sortie standard et passe ensuite tous les nombres reçus qui ne sont pas des multiples de 2 au troisième, le troisième affiche le premier nombre reçu (i.e. le nombre 3) sur la sortie standard et passe ensuite tous les nombres reçus qui ne sont pas des multiples de 3 au quatrième, et ainsi de suite jusqu'au (n-1)-ième qui affiche  le premier nombre reçu (disons p) sur la sortie standard et passe ensuite tous les nombres reçus qui ne sont pas des multiples de p au n-ième, le n-ième affiche le premier nombre reçu, tue tous les autres processus et se termine.


Exercice 5.

Ecrire un programme qui:
  1. attend une ligne (une commande) sur l'entrée standard (vous pouvez utiliser la fonction de bibliothèque fgets).
  2. la décompose en mots séparés par des espaces
  3. exécute cette commande par le biais de la primitive système execvp.
  4. revienne au point 1.
Félicitations vous avez écrit un shell !


Exercice 6.

Reprendre le programme précédent et ajouter un traitement spécial dans le cas où la commande est terminée par le symbole &.


Exercice 7.

Réaliser le jeu "deviner un nombre". On écrira 2 programmes C : un client et un serveur qui communiquent via des tubes nommés. Le serveur choisit un nombre au hasard entre 1 et 1000,  crée 2 tubes nommés question et reponse et, à chaque fois qu'il reçoit une proposition sur le tube question, renvoie sa réponse (signifiant "trop petit", "trop grand" ou "égal") sur le tube reponse. Le client lit des propositions de nombre sur l'entrée standard et pour chaque proposition de nombre, envoie ce nombre au serveur et affiche la réponse du serveur.