Examen de Systèmes II -- Licence -- Juin 2005
É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.
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 ?
É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.
É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.
Soient trois programmes dont le code est le suivant:
Programme 1 | Programme 2 | Programme 3 |
while (1) {
f1();
} | while (1) {
f2();
} | while (1) {
f3();
} |
En utilisant les sémaphores:
- 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) ?
- 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,... ?
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:
- la première contenant le nom du tube qui devra être utilisé pour renvoyer la réponse,
- la seconde contenant la commande HTTP que le serveur doit exécuter.
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:
- que chaque sous-processus recevra en entrée standard la commande envoyée par le client,
- que chaque sous-processus écrira sa réponse sur sa sortie standard (laquelle aura bien été préparée par le serveur principal pour correspondre au tube de réponse client).
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
- où 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:
Il est donc demandé:
- de décrire avec précision les différentes structures de données utilisées (formats des messages, etc),
- d'écrire le code de la partie cliente: pandarouge,
- d'écrire le code de la partie serveur: geronimod,
- 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,
- écrivez le code correspondant au mécanisme précédent,
- critiquez le modèle de serveur ici construit! Avantages, inconvénients, etc ?