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

Besoin de traduction Cet article ou cette section nécessitent d'être traduit (entièrement ou non) depuis l'article en anglais.

Si vous connaissez la langue utilisée, n'hésitez pas !

Implémenter un serveur hello

Informations

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

Besoin de traduction Cet article ou cette section nécessitent d'être traduit (entièrement ou non) depuis l'article en anglais.

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 :
  • 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 :
  • 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 :
  • 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.

Outils personnels