TD 4

Vendredi 7 février 2003

1  Redirections

Soit le type :
      
type redirection =
    In_to_file of string        (* < file *)
  | Out_to_file of string       (* > file *)
  | Err_to_file of string       (* 2> file *)
  | Out_append_file of string   (* >> file *)
  | Err_to_out ;;               (* 2>&1 *)
Écrire une commande command_fg_redirect qui prend en argument une commande, ses arguments sous forme d'un tableau et une liste de redirections et qui exécute la commande après avoir effectué les redirections nécessaires puis attend sa terminaison.

Par exemple, command_fg_redirect cat [||] [ In_to_file input; Out_append_file output] redirige l'entrée standard de la commande cat vers le fichier de nom input et la sortie standard vers le fichier de nom output.

Les redirections sont effectuées dans l'ordre où elles apparaissent. Par exemple, command_fg_redirect cmd [||] [ Out_to_file /tmp/foo; Err_to_out] redirige la sortie standard et la sortie d'erreur vers le fichier /tmp/foo et command_fg_redirect cmd [||] [ Err_to_out ; Out_to_file /tmp/foo ] redirige la sortie d'erreur vers le stdout d'origine et redirige stdout vers /tmp/foo.
(corrigé)

2  Signaux

Écrire une fonction mon_system qui exécute une commande passée en argument sous la forme d'une chaîne de caractères en passant cette dernière en argument de la commande /bin/sh -c. Cette fonction se termine quand la commande termine. Pendant l'exécution de la commande le signal SIGCHLD est bloqué et les signaux SIGINT et SIGQUIT sont ignorés. La fonction retourne la valeur de retour de la commande ou lève une exception en cas d'erreur.

Attention, il faut remettre la gestion des signaux dans l'état où vous l'avez trouvé, même en cas de levée d'exception.
(corrigé)
Testez votre fonction dans un petit programme, par exemple avec mon_system sleep 10. En particulier, vérifiez que le signal envoyé par ^C est bien reçu par sleep mais pas par votre programme.
(corrigé)

3  Tubes

Écrire une fonction pipeline_commands qui prend en argument une liste de couples (cmd,args) et qui redirige la sortie standard de la première commande vers l'entrée de la seconde et ainsi de suite.

Par exemple, pipeline_commands [(cat,[||]);(grep,[|"test"|]);(wc,[|"-l"|])] affiche le nombre de lignes qui contiennent le texte test lu sur l'entrée standard.

On supposera qu'il n'y a pas de processus en tâche de fond susceptibles de se terminer pendant l'exécution de la fonction (tous les fils sont terminés quand wait lève une exception ECHILD). Nous supposerons également, que l'appel à wait ne peut pas être interrompu par un signal (par exemple SIGCHLD), sauf en cas d'erreur grave, ce qui termine de toute façon le programme.
(corrigé)
Quels seraient les problèmes qu'il faudrait gérer s'il existait des processus en tâche de fond ?
(corrigé)



This document was translated from LATEX by HEVEA and HACHA.