Exercices
De HurdFr_Wiki.
Cet article est une ébauche. Cela signifie qu'il est n'est pas considéré par son auteur comme terminé.
Vous êtes libre de l'améliorer et de retirer cet avertissement si vous jugez que l'article est maintenant finalisé.
Ces exercices ont plusieurs objectifs :
- Vous donner une expérience directe d'utilisation des interfaces du Hurd et de Mach ;
- Vous amener à chercher dans la documentation des explications sur les concepts et abstractions utilisés ;
- Fournir des codes d'exemple qui peuvent être réutilisés pour les projets de code.
Chaque exercice doit donc contenir ces éléments :
- Un énoncé aussi précis que possible, bien sûr ;
- Des indications sur la documentation nécessaire et utile pour l'exercice ;
- La liste des pré-requis (et si possible les exercices nécessaires à l'apprentissage de ces pré-requis) ;
- Le temps et la complexité estimés.
Les corrigés sont disponibles sur cette page.
Sommaire |
Exercices
IPC sans MiG
Cet exercice a été proposé par Neal Walfield sur son site.
Consigne
| | Si vous connaissez la langue utilisée, n'hésitez pas ! |
Informations
- Documentation :
- Mach 3 Kernel Principles, chapitre 2 ;
- Mach 3 Kernel Interfaces, entrées :
- mach_msg ;
- mach_msg_header_t' ;
- mach_msg_type_t ;
- Mach 3 Server Writer's Guide, pour les C Threads.
- Pré-requis : assez bonne maîtrise du C
- Temps estimé : Neal estime 20 à 40 heures (principalement lecture de documentation très bien faite).
Commentaires : il y a plusieurs façons de faire cet exercice. La plus simple (et la plus recommandée) est de créer deux ports (un pour le serveur, un pour le client). La seconde est d'utiliser un seul port, mais cela nécessite l'utilisation de mutex (intéressant pour découvrir la façon dont on les gères avec les C Threads).
IPC avec MiG
Il s'agit d'implémenter le même serveur que précédemment, mais en utilisant MiG (et en déclarant le RPC hello avec MiG).
Consigne
| | Si vous connaissez la langue utilisée, n'hésitez pas ! |
Implémenter un serveur répondant au seul RPC hello, défini via MiG. Un ou plusieurs threads client doit envoyer des RPC hello en fournissant son nom, et le serveur doit répondre Hello, nom ! à chacun.
Informations
- Documentation :
- Mach 3 Server Writer's Guide, chapitre 3
- Pré-requis : bonne maîtrise du C, maîtrise de la documentation de l'exercice ci-dessus (voire de l'exercice).
- Temps estimé : 20 à 30 heures sans l'exercice ci-dessus, 5 à 10 heures avec.
Commentaires : Il y a là aussi plusieurs possibilités. La meilleure façon d'apprendre est sans doute de n'utiliser que MiG et Mach. Cependant, cela peut être une bonne occasion d'apprendre libports (notamment pour la création du port right) qui simplifie considèrablement le code. Une des améliorations possibles est d'utiliser la transmission de données out of line, ce qui évite d'imposer une longueur arbitraire au nom du client.
Translator fortune
Il s'agit d'implémenter un translator basique, en lecture seule, qui fournit une fortune à chaque fois qu'on lit le nœud auquel il est attaché.
Consigne
Voici le comportement attendu, en action :
$ ./fortune Must be started as a translator. $ settrans -ca .signature ./fortune $ cat .signature I never failed to convince an audience that the best thing they could do was to go away. $ echo "This is a really good fortune ah ah ah" > .signature bash: .signature: Read-only file system
Le translator n'étant attaché qu'à un nœud, il convient d'utiliser libtrivfs. Il n'est évidemment pas utile de parser les fichiers de fortune soi-même : il suffit d'utiliser l'utilitaire `fortune'.
Il y a des améliorations possibles : notamment, le fait d'utiliser une commande passée en argument plutôt que nécessairement l'utilitaire "fortune" (ce qui permet notamment de préciser la section des fortunes que l'on souhaite, etc.). Il y a également la possibilité de supporter le mode écriture avec une autre commande. Ces deux variantes sont présentés dans les corrigés. Il y a également possibilité de rendre l'utilitaire multi-threadé pour s'entraîner (pas encore de corrigé disponible pour cette variante, mais il est très simple).
Informations
- Documentation :
- le Hacking Guide ainsi que sa traduction française.
- Le manuel de référence du Hurd.
- </usr/include/hurd/trivfs.h> (les fonctions à définir y sont assez bien documentées).
- Les exemples : <trans/hello.c> dans les sources du Hurd (et <trans/hello-mt.c> pour la variante multithreadée) ou <trans/null.c>.
- Pré-requis : bonne maîtrise du C, bonne compréhension des mécanismes de base (ports, ...).
- Temps estimé : 40 à 50 heures.
Translator mirrorfs et hook
Il s'agit d'implémenter progressivement un translator netfs basique. Tout d'abord, mirrorfs ne fait que fournir un miroir parfait d'un répertoire existant ailleurs : les requêtes lui sont simplement transmises à l'identique au translator en charge du nœud « mirroré ». Ce translator n'a d'autre intérêt que de servir de base à tout netfs qui a pour but de fournir un « clone » d'une arborescence où les opérations FS auraient un comportement différent.
Par exemple, supposons que nous disposons d'un répertoire ~/hurdfr/exercices/corriges, contenant les corrigés des exercices. Imaginons que nous souhaitions avoir systématiquement les corrigés accessibles sur le net : nous pourrions vouloir qu'à chaque accès en écriture, une copie soit effectuée sur le serveur. Pour ça, nous utiliserions un translator mirrorfs auquel nous rajouterions un hook en fin d'écriture, qui exécuterait la commande pour copier le fichier modifié. Ces hooks pourraient être configurables (écriture, lecture ; avant, après ; tel ou tel fichier, ou tous) : nous aurions alors le translator hook.
- Documentation :
- Le manuel de référence du Hurd
- </usr/include/hurd/netfs.h>
- les sources de ftpfs, de xmlfs ou de translators fournis sur hurdextras
- Pré-requis : bonne maîtrise du C, déjà écrit un translator trivfs (voir cet exercice).
- Temps estimé : 30 à 40 heures en ayant réalisé fortune auparavant.
ftpd pour le Hurd
Il s'agit d'implémenter un serveur FTP basique tirant partie des possibilités de auth. Sa fonctionnalité principale doit être de ne tourner avec aucun droit après la réalisation du bind(), et de ne les gagner qu'en soumettant le login/mot de passe fourni à password.
Outre les fonctionnalités basiques du FTP (RETR/PUT), une amélioration peut être de fournir des commandes pour gagner/perdre un jeton via FTP.
- Documentation :
- Pré-requis : bonne maîtrise du C, maîtrise de base des sockets
- Temps-estimé : 20 à 30 heures en ayant des connaissances Unix

