TD 3 |
mon_exec: string -> string array -> unit telle que
mon_exec "truc" [|"b";"c"|] exécute la commande truc, en la cherchant dans le path par défaut, avec les
arguments b et c. Notez que le tableau passé en argument
à mon_exec ne contient pas la commande en
case d'indice 0, contrairement à la fonction Unix.execvp.
mon_exec dans un fichier mon_exec.ml qui appelle la
fonction précédente en lui passant sa ligne de commande.
command_wait: string -> string array -> int
telle que
command_wait "truc" [|"b";"c"|] exécute la commande truc avec les
arguments b et c, attend qu'elle termine, renvoie son code de
retour et indique la raison de la terminaison.
mon_exec et les
erreurs au retour par mon_waitpid. Une erreur de fork sera considérée
comme fatale et n'est pas rattrapée.
command_bg: string -> string array -> int telle que
command_bg "truc" [|"b";"c"|] exécute la commande truc avec les
arguments b et c et renvoie immédiatement son pid sans attendre.
command_seq: (string * string array) list -> int qui
exécute l'une après l'autre les commandes avec leurs arguments, puis renvoie
le code de retour de la dernière commande exécutée.
command_and
(respectivement command_or) qui exécute les arguments en
séquence jusqu'à ce qu'une des commandes échoue (respectivement
réussisse) et renvoie le code de retour de la dernière commande exécutée.
jobs : unit -> unit qui affiche la liste des
pid des
processus fils qui s'exécutent en arrière plan. Vous pourrez par exemple
modifier la fonction commande_bg et rattraper les signaux
sigchld. Pour tester votre fonction, vous pouvez tuer depuis un autre
shell les processus en cours avec sigint.
fg : unit -> int qui met en avant plan le
dernier processus mis en arrière plan et renvoie le code de retour de
ce processsus quand il termine.
Ctrl-Z dans un shell. Pour cela, on envoie un
signal SIGTSTP, ce qui a pour effet de stopper le processus et qui
le place en arrière plan. Réécrire la fonction command_wait en
conséquence et une fonction fg utilisant le signal SIGCONT pour
replacer la commande en premier plan.
command: string -> int qui décompose son
argument (à l'aide de la bibliothèque d'expressions régulière Str)
en une suite de mots séparés par des espaces, exécute la commande
correspondante et renvoie son code de retour.;), des conjonctions (&&) et
disjonctions (||) de commandes dans son argument
(pour simplifier, on prendra tous les opérateurs associatifs à droite).
Par exemple
command "ls -l ; ls toto && cat toto || echo Not_found"
doit exécuter ls -l puis ls toto. Si cette dernière est un succès
alors elle exécute cat toto sinon elle exécute echo Not_found.
command_seq, command_and et command_or
pour qu'elles puissent elles-mêmes prendre des commandes complexes en
argument.
daemonize: string -> string array -> bool qui
exécute une commande avec ses arguments et lui donne le statut de
démon, c'est-à-dire lui donne comme père le processus init. De
plus un démon ne doit pas pouvoir être exécuté simultanément plus
d'une fois. Pour cela, vous utiliserez un fichier verrou (O_EXCL) de nom
/tmp/<cmd>_lock et contenant le pid du démon. En cas d'échec cette
fonction renvoie false.
kill_daemon: string -> unit qui tue le démon
dont le nom est passé en argument en utilisant le fichier verrou
créé précédemment.
This document was translated from LATEX by HEVEA and HACHA.