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.
-
É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.
- É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.
-
É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.
- 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.
- 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.
- Tester la fonction pipe_two_progs avec ces deux programmes.
- Écrire une fonction pipe_n_progs pour enchaîner une liste de
programmes.
- Écrire un programme qui enlève les occurrences multiples
des éléments d'une
liste.
- 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.
-
Modifier le programme pour qu'une variable globale result
contienne à tout instant
la liste des nombres premiers déjà trouvés.
- Écrire une fonction sigint_handle
pour le traitement du signal sigint qui affiche le contenu
de result.
- Modifier le traitement par défaut du signal sigint en
lui associant la fonction sigint_handle.
- 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.