Précédent Index Suivant

Exercices

Les trois exercices proposés ici manipulent respectivement les descripteurs de fichiers, les processus, les tubes de communication, et les signaux. Les deux premiers sont des classiques de la programmation système sous UNIX. Il peut être intéressant de comparer le code Objective CAML avec le code C que l'on trouve dans les distributions d'UNIX ou de LINUX.

Compter les mots : la commande wc

On veut (re)programmer la commande UNIX wc qui compte le nombre de lignes, mots ou de caractères que contient un fichier. Les mots sont séparés par un espace, une tabulation ou un retour chariot. On ne compte pas les caractères séparateurs.
  1. Écrire une première version de cette commande qui ne traite qu'un seul fichier dont le nom est passé en argument sur la ligne de commande.
  2. Écrire une version plus élaborée qui peut prendre en argument tout ou partie des trois options : -l, -c, -w ainsi que plusieurs noms de fichiers. Les options indiquent, respectivement, si l'on veut voir afficher le nombre de lignes, caractères ou mots. L'affichage de chaque résultat sera précédé du nom du fichier concerné.

Pipelinage pour correcteur orthographique

Cet exercice cherche à enchaîner une suite d'actions. Chaque action prend en entrée le résultat de l'action précédente. La communication s'effectue avec des pipes où seule la sortie d'un processus est redirigée vers l'entrée du processus suivant, à la manière du symbole | des interprètes de commande UNIX.

  1. Écrire une fonction pipe_two_progs de type string * string list -> string * string list -> unit telle que pipe_two_progs p1 p2 lancent les programmes p1 a1 ... an et p2 b1 ... bp en redirigeant la sortie standard de p1 sur l'entrée standard de p2. Les ai et bi sont les arguments de la ligne de commande de chaque programme.
  2. On reprend la fonction verifie de l'exercice de la page pour écrire un premier programme. Modifier là pour que la liste des mots incorrects soit envoyée sous forme d'une ligne par mot sur la sortie standard.
  3. Le deuxième programme prend une suite de chaînes de caractères sur son entrée standard, et la trie selon l'ordre lexicographique. On pourra utiliser la fonction Sort.list qui trie une liste selon un prédicat donné. La liste triée est ensuite affichée sur la sortie standard.
  4. Tester la fonction pipe_two_progs avec ces deux programmes.
  5. Écrire une fonction pipe_n_progs pour enchaîner une liste de programmes.
  6. Écrire un programme qui enlève les occurrences multiples des éléments d'une

    liste.
  7. Tester la fonction pipe_n_progs avec ces trois programmes.

Trace interactive

Lors d'un calcul complexe, il peut être utile d'interagir avec le programme pour vérifier la progression de ce calcul. On reprend pour cela l'exercice, de la page , sur la calcul des nombres premiers contenus dans un intervalle.
  1. Modifier le programme pour qu'une variable globale result contienne à tout instant la liste des nombres premiers déjà trouvés.
  2. Écrire une fonction sigint_handle pour le traitement du signal sigint qui affiche le contenu de result.
  3. Modifier le traitement par défaut du signal sigint en lui associant la fonction sigint_handle.
  4. Compiler le programme, puis lancer l'exécutable en lui passant 1000000 comme borne supérieur de l'intervalle de recherche. Pendant cette exécution, envoyer le signal sigint au processus, soit en utilisant la commande kill, soit en tapant le caractère CTRL-C.

Précédent Index Suivant