Sujet Projets 2 nd Semestre Seuls les appels systèmes vus en cours sont autorisés. L usage d autres fonctions doit impérativement être validé par l enseignant. La date d ouverture pour l assignation de projets est le 14 Mai à 18h30. Les mails envoyés avant cette date ne seront pas pris en compte. Les étudiants doivent proposés au moins 6 sujets par ordre de préférence. Les groupes doivent être constitués obligatoirement de 2 personnes pour les SR et d une seule pour les AL. Les mails doivent être envoyés à l adresse suivante : anthony.busson@u-psud.fr. Mini-shell : Il y a 9 mini-shells. La base est toujours la même. Un prompt simple est affiché (>), une chaîne de caractère est saisie au clavier et traitée par votre minishell. Lorsque cette chaîne de caractère correspond simplement à une commande, il faut lancer cette commande (execl). Les dossiers dans lesquels on cherche l exécutable correspondant à cette commande sont fixés par la variable d environnement PATH (voir getenv()). Une fois la commande exécutée le prompt (>) s affiche de nouveau. La commande cd doit être interne à votre shell. 1. Lancement de commandes avec complétion (recherche dans le PATH) et des noms de fichiers. Attente de la terminaison de la commande avant réaffichage du prompt. 2. Lancement de commandes dans le PATH. Pas de complétion. Gestion des commandes : a. Commande1 commande2 b. Commande1 && commande2 c. Commande1 & d. Commande1 ; commande2 3. Lancement des commandes du PATH et gestion de toutes les redirections : a. commande > fichier b. commande < fichier c. commande >> fichier d. commande 2> fichier e. commande1 commande2 4. Lancement des commandes du PATH et du répertoire local. Gestion des variables. a. Assignation : mavar=12 b. Remplacement des valeurs : echo $mavar (doit fonctionner pour n importe quelle commande). 5. Lancement des scripts. Lancement des commandes usuelles. Si la commande commence par le mot clé script l argument suivant doit correspondre à un script. Ces scripts ne doivent contenir que des commandes du PATH ou des scripts précédé du mot clé script. Le script doit être exécuté dans un sous shell (de votre shell a vous). Exemple : a. > script monscript (doit exécuter le script monscript). 6. Lancement des commandes du PATH. La commande mkfifo doit être implémentée comme une commande du shell. Les redirections de processus sur le pipe nommé doivent être gérées pour permettre la communication entre des processus indépendant. Exemple : a. > mkfifo nomdupipe b. > commande1 > nomdupipe c. > commande2 < nomdupipe
7. Ecrire un mini-shell qui lance toutes les commandes en tache de fond. Un appel a wait doit être effectue lorsqu un processus est terminé (avec affichage du pid du processus qui s est terminé) sans que cela bloque le mini-shell (utilisation des signaux). 8. Ecrire un mini-shell qui lance toutes les commandes du PATH. Il devra aussi implémenter le «if» : a. if commande1 ; then liste_de_commande ; fi 9. Ecrire un mini-shell quii lance toutes les commandes du PATH. Il devra aussi implémenter le for (celui du shell). Les commandes pourront prendre des arguments, en particulier la valeur de la variable de la boucle. Exemples : a. for var in liste_de_mots ; do listedecommandes ; done b. for var in mot1 mot2 mot3 ; do echo $mot1 ; done Autres 10. Circulation de messages entre 5 processus. Vous devez créer 5 processus (issu de fork). Un message devra circuler de processus en processus toujours dans le même ordre. Le moyen de communication sera le pipe. Par exemple : le processus 1 envoi message-pid1. Ce message est reçu par le processus 2 et affiché. Le processus 2 rajoute son pid au message (message-pid1-pid2), etc. Un nouveau message est généré toutes les secondes par le processus 1. 11. Ecrire deux processus. Les deux processus ne sont pas issus d un fork. Ils affichent leur pid toutes les secondes. Chaque processus attend un temps aléatoire compris entre 0 et 10 secondes. A la terminaison de ce temps, le processus demande a l utilisateur de taper une chaîne de caractères. Le processus émet alors un signal à l autre processus pour lui indiquer qu il veut lui envoyer un message. Le message sera alors envoyé à l autre processus. Celui-ci devra interrompre l affichage de son pid, devra affiché «Vous avez reçu un message» et afficher le message. Les deux processus ne devront pas être issu d un fork et devront être exécutés dans deux consoles différentes. 12. Ecrire un programme qui lit et affiche un fichier texte fixé à l avance comportant deux colonnes. La première colonne est un ensemble de mots en français et la seconde leur traduction en anglais. Le fichier doit être chargé par votre programme et le dictionnaire doit être géré au travers de variables, tableaux ou liste chaînée par votre programme. Le processus affiche son pid et se met en attente sur l entrée standard, l utilisateur tape un nom en français et le processus affiche l équivalent en anglais, puis il se remet en attente. Si l utilisateur tape sur Ctrl-C, votre programme affichera un message «Souhaitez vous quitter l application», si l utilisateur tape oui votre programme s arrêtera, sinon il se remettra en attente de nouveau mot. Le fichier contenant les mots peut être modifié durant l exécution du programme. L émission d un signal SIG_HUP indiquera à votre processus de recharger son fichier de mots. 13. Votre programme devra lancer 10 threads. Chaque thread devra écrire dans un fichier 3 lignes saisies par l utilisateur. Une fois les 3 lignes saisies le thread écrira les 3 lignes dans le fichier. Bien sûr, les 10 threads ne peuvent pas demandé à l utilisateur les 10 lignes en même temps. Un thread doit attendre que le thread précédent ait récupéré ces 3 lignes pour demander à son tour les 3 lignes à l utilisateur. Les lignes écrites dans le fichier devront avoir le format suivant «N DuThread : ligne_tapée_par_l utilisateur». 14. Ecrire trois programmes qui seront lancé dans la même console (./prog1 &./prog2 &./prog3 &). Chacun devra afficher un message sur le terminal mais dan ordre précis et toujours le même. Le temps entre la génération de deux messages correspondra a un tirage aléatoire entre 0 et 5sec. Ces temps aléatoire permettent de désynchroniser la
génération des messages. Vous devez cependant garantir que l écriture des messages est affichée dans le bon ordre. 15. Ecrire un programme qui permet de jouer au morpion. Les cases du jeu du morpion pourront être numérotées A1, A2, A3, B1,,C3. Lors du jeu votre programme se met en attente de la case joué par l utilisateur, l utilisateur rentre les coordonnées de la case dans laquelle il joue. Votre programme jouera alors à son tour (vous pouvez tirer une case au hasard si vous ne souhaitez pas établir de stratégie). Après chaque coup votre programme devra affiché le jeu, cela pourra se faire très simplement sous la forme : A B C 1 x o x 2 o o 3 x Bien sûr, lorsqu un des deux joueurs a aligné 3 pions, le jeu s arrête et un message de victoire s affiche. Votre programme peut jouer avec lui-même, dans ce cas le programme doit être lancé avec une option particulière. Le processus sera dupliqué par un fork et un pipe permettra de communiquer les coups. 16. Protocole de routage de type «vecteur de distance». Ecrire un programme qui génère 5 processus (fork). Les processus communiquent au travers de pipes nommées. Chaque processus émule un routeur ayant deux sous réseaux dont les adresses réseau sont tirées aléatoirement dans [1-223].0.0.0/8. Un processus aura un tube de communications avec 3 autres processus tiré au hasard. Un processus envoi un message contenant son vecteur de distance toutes les 30 secondes (utilisé une alarme) sur tous les pipes en écritures. Il y 10 processus qui seront lancé et qui correspondront à ce même programme. Les communications seront bidirectionnelles. A la réception des messages, l algorithme distance vector devra être appliqué pour mettre a jour une table de routage indiquant pour chaque processus quel est le prochain saut. 17. Boîte aux lettres. Ecrire un programme qui sera exécuté en tâche de fond. Il reçoit des emails d autre processus qui seront envoyés n importe quand. Le processus collecteur stocke ces emails tant qu ils n ont pas été lu. L attente sur un sémaphore (opéré par un thread) permettra au collecteur de savoir quand est ce qu un nouveau processus se connecte. L échange des messages devra se faire via des pipes nommés. 18. Test de débit des pipes. Ecrire un programme se dupliquant grâce à l appel à fork() et qui créer un tube de communication entre le père et les fils. Le but de ce sujet est de tester le débit du pipe. Il faut émettre 10Mo sur le pipe et en réception mesurer le temps entre le début de l émission et la fin pour calculer le débit. Faire de même avec 2 pipes et 3 processus. Ce qui est lu sur le premier pipe est renvoyé sur le second et on mesure le débit en bout de chaîne. 19. Programmation socket 1 : Implémenter un serveur http simple. Le serveur se met à l écoute sur le port 80 (pensez à arrêter votre serveur web si vous en avez un). Lors de l initialisation d une connexion TCP, vous ferez un fork(). Le père se remettra à l écoute des connexions entrantes. Le fils gérera la connexion. La chaîne envoyée par le client sera : CHAMP1 CHAMP2 Vous ne prendrez en compte que la première ligne décrivant le fichier à renvoyer. L ensemble des champs envoyés par le client se termine par un double retour chariot,
cela indique la fin de la requête. Votre serveur va chercher le fichier à renvoyer dans un répertoire particulier (c est généralement /var/www/ pour un serveur apache, vos prendrez autre chose dans le cadre de ce projet) et l enverra au client. Si le fichier n existe il faudra renvoyer un fichier html simple indiquant File not found!. N hésitez pas à tester votre serveur avec votre navigateur. 20. Programmation socket 2 : Implémenter un serveur http simple. Le serveur se met à l écoute sur le port 80 (pensez à arrêter votre serveur web si vous en avez un). Lors de l initialisation d une connexion TCP, la connexion entrante sera gérée par un thread. Le processus initial se remettra à l écoute des connexions entrantes. Le thread gérera la connexion. La chaîne envoyée par le client sera : CHAMP1 CHAMP2 Vous ne prendrez en compte que la première ligne décrivant le fichier à renvoyer. L ensemble des champs envoyés par le client se termine par un double retour chariot, cela indique la fin de la requête. Votre serveur va chercher le fichier à renvoyer dans un répertoire particulier (c est généralement /var/www/ pour un serveur apache, vos prendrez autre chose dans le cadre de ce projet) et l enverra au client. Si le fichier n existe il faudra renvoyer un fichier html simple indiquant File not found!. N hésitez pas à tester votre serveur avec votre navigateur. 21. Programmation socket 3 : Il s agit de coder un injecteur. Il s agit d un petit logiciel qui génère un certain nombre de requêtes http pour la même page web sur un serveur. Le but étant de tester les performances du serveur. Votre programme prendra 3 arguments :./monprogramme 127.0.0.1 www.nomdusite.fr index.html 112 Le premier argument est l adresse IP du serveur, le second la page web que l on souhaite tester et le troisième le nombre de téléchargements que l on souhaite effectuer. Votre programme doit mesurer le temps entre l émission de la première requête et la réception du dernier octet correspondant au dernier téléchargement. Pour l exemple ci-dessus, il s agit de mesurer le temps de téléchargement des 112 pages index.html. Ces requêtes doivent se faire en parallèle. Une connexion distincte sera ouverte pour chacune. Il faudra utiliser un fork() pour chacune d elle. La requête http doit avoir le format suivant : HOST : www.nomdusite.fr Vous pourrez tester votre injecteur sur n importe quel site. 22. Programmation socket 4 : Il s agit de coder un injecteur. Il s agit d un petit logiciel qui génère un certain nombre de requêtes http pour la même page web sur un serveur. Le but étant de tester les performances du serveur. Votre programme prendra 3 arguments :./monprogramme 127.0.0.1 www.nomdusite.fr index.html 112 Le premier argument est l adresse IP du serveur, le second la page web que l on souhaite tester et le troisième le nombre de téléchargements que l on souhaite effectuer. Votre programme doit mesurer le temps entre l émission de la première requête et la réception du dernier octet correspondant au dernier téléchargement. Pour l exemple ci-dessus, il s agit de mesurer le temps de téléchargement des 112 pages
index.html. Ces requêtes doivent se faire en parallèle. Une connexion distincte sera ouverte pour chacune. Il faudra utiliser un thread pour chacune d elle. La requête http doit avoir le format suivant : HOST : www.nomdusite.fr Vous pourrez tester votre injecteur sur n importe quel site. 23. Programmation socket 5 : Il s agit de coder un robot. Il s agit d un petit logiciel qui va rechercher tous les liens de toutes les pages web de manière récursives et qui les écrits dans fichier au fur et à mesure. Il faut d abord coder un petit client comme pour l exercice précèdent. Les arguments sont les mêmes que pour le projet 22. Les arguments correspondent au point de départ de votre robot. Il télécharge cette page web, la lit et recherche tous les liens. Pour chaque lien trouvé, il l écrit dans un fichier texte (toujours le même) puis effectue un fork(), le père continue de lire la page à la recherche des autres liens et le fils télécharge la page correspondant au lien, et effectue la même procédure. Le format d un lien sur une page html est le suivant : href='http://nomdusite/nomdelapage' 24. Programmation socket 6 : Il s agit de coder un robot. Il s agit d un petit logiciel qui va rechercher tous les liens de toutes les pages web de manière récursives et qui les écrits dans fichier au fur et à mesure. Il faut d abord coder un petit client comme pour l exercice précèdent. Les arguments sont les mêmes que pour le projet 22. Les arguments correspondent au point de départ de votre robot. Il télécharge cette page web, la lit et recherche tous les liens. Pour chaque lien trouvé, il l écrit dans un fichier texte (toujours le même) puis crée un thread, la fonction initiale continue de lire la page à la recherche des autres liens et le thread nouvellement créé télécharge la page correspondant au lien, puis effectue la même procédure. Le format d un lien sur une page html est le suivant : href='http://nomdusite/nomdelapage'