Précédent Remonter

4  watch : surveillance d'exécution

On désire écrire une commande watch qui exécute une commande donnée sous la surveillance de l'utilisateur : l'utilisateur doit saisir au clavier un caractère <intr> (c'est-à-dire control-C) à intervalle régulier. Si à l'échéance du délai le caractère n'a pas été saisi, l'exécution de la commande sera interrompue.

Sur la ligne de commande, on fournira donc la valeur de l'intervalle (en secondes), la commande à exécuter et ses paramètres :
watch duration command [args]...
Dans ses grandes lignes, la commande watch consiste donc à créer un processus fils qui exécutera la commande command ; à définir un traitant de signal qui met fin à ce processus fils et à associer ce traitant de signal au signal de temporisation SIGALRM ; à définir un traitant de signal pour SIGINT qui réinitialise le temporisateur. On utilisera la primitive
int alarm(unsigned seconds);
armant ou ré-armant le temporisateur.

On suppose que le programme définit et initialise les variables suivantes :
static pid_t pid;               /* the child process */
static int duration; 
static char *command[];

int 
main(int argc, char *argv[])
{   
    assert(argc >= 3);

    duration = atol(argv[1]); 
    command = argv+2;

    ...


Exercice 9
   Soient les deux fonctions sigint_hdlr() et sigalrm_hdlr() devant respectivement être associées comme traitant de signal des signaux SIGINT et SIGALRM. Donnez la suite du code de la fonction main() installant ces traitants de signaux et armant le minuteur à duration secondes.


Exercice 10
   Donnez la suite de la fonction main() assurant la création du processus fils et l'exécution par celui-ci de la commande demandée.


Exercice 11
   Expliquez comment la fonction

static int sigalrm_hdlr();
va interrompre le processus fils et donnez le code de cette fonction.


Exercice 12
   Supposant que le processus père boucle sur un appel à la fonction pause(), expliquez comment terminer proprement le programme watch à la terminaison de son fils et donnez le code correspondant.


Précédent Remonter