Examen de Systèmes II -- Licence -- Juin 2005

Exercice

Écrire en langage C une fonction de prototype void tube(int n,char *cmds[]); permettant d'exécuter en concurrence n processus chacun exécutant le programme cmds[i] avec une communication par tube anonyme entre chacun d'eux de sorte que la commande i communique avec la commande i+1.

Exercice

Soit le fragment de programme suivant:
fork(); fork(); fork();
if (fork()) { fork(); fork(); fork(); }

Combien de processus auront été créés si ce code est exécuté jusqu'au bout par tous les processus issus d'un même processus initial ?

Exercice

Écrire un programme prenant deux arguments: horloge délai pid et permettant d'envoyer à intervalles réguliers (toutes les délai secondes) le signal SIGALRM au processus d'identité pid.

Exercice

Écrire une commande prenant un argument: interface pid et permettant, à l'infini, de saisir une chaîne de caractères, d'envoyer la chaîne lue dans un tube nommé de nom /tmp/tubepid puis de prévenir le processus consommateur/lecteur de la présence d'un message dans le tube en lui envoyant un exemplaire du signal SIGUSR1.

Exercice

Soient trois programmes dont le code est le suivant:
Programme 1Programme 2Programme 3
while (1) {
  f1();
}
while (1) {
  f2();
}
while (1) {
  f3();
}

En utilisant les sémaphores:
  1. quelles opérations sont à rajouter pour que les fonctions fi s'exécutent en s'excluant mutuellement les unes les autres (ie: un seul processus exécute sa fonction fi les autres étant en attente) ?
  2. quelles opérations sont à rajouter pour que les fonctions fi s'exécutent toujours séquentiellement et toujours dans l'ordre f1,f2,f3,f1,f2,... ?

Problème

On vous demande de réaliser un mini serveur HTTP.

Un client HTTP (programme de nom pandarouge) se connecte au serveur en ouvrant un tube (de nom /tmp/portHTTP), lui envoie un message constitué de deux parties:

Puis attend sur le tube de réponse le message envoyé par le serveur. La suite du comportement dépasse le cadre de ce cours et n'a aucun intérêt «système».

Le serveur HTTP (programme de nom geronimod) attend en permanence sur son tube d'entrée l'arrivée d'un message. À chaque message arrivé, il délègue son traitement à un sous-processus créé pour l'occasion, puis se remet en attente d'un autre message de connexion. Si le serveur principal détecte une condition rendant impossible la réalisation du service, il renverra lui-même un message d'erreur au client. Les sous-processus sont donc chargés de réaliser l'exécution des commandes provenant des clients, on notera:

La seule commande GET référence permet d'obtenir en réponse le contenu du fichier de référence donnée.

Les réponses possibles sont:

200 Ok.\nLongueur: lg\ncontenu
lg est la longueur des données (nombre d'octets) envoyées et désignées par contenu,
403 Forbidden\n
si le serveur trouve un fichier correspondant à la référence mais ne peut le lire,
404 Not found\n
si le serveur ne trouve pas de fichier correspondant à la référence demandée,
500 Server error\n
si le serveur détecte une condition empêchant la réalisation du service,

La figure suivante illustre les différents mécanismes mis en œuvre:

schéma récapitulatif

Il est donc demandé:

  1. de décrire avec précision les différentes structures de données utilisées (formats des messages, etc),
  2. d'écrire le code de la partie cliente: pandarouge,
  3. d'écrire le code de la partie serveur: geronimod,
  4. sachant que les fichiers demandés à un serveur HTTP sont presque toujours les mêmes, décrivez un mécanisme qui permettrait de servir au plus vite les fichiers les plus demandés,
  5. écrivez le code correspondant au mécanisme précédent,
  6. critiquez le modèle de serveur ici construit! Avantages, inconvénients, etc ?