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.