Précédent Table des matières

3  Mutation de processus


Exercice 9
 (condition)   Il s’agit d’implanter une commande on qui exécute une seconde commande cmd si et seulement si l’exécution d’une première commande pred se termine sur un succès :
on pred do cmd
On utilise cette commande comme sur l’exemple suivant :
on test -r spool/file do lpr spool/file
qui ne fait appel à la commande d’impression lpr que si le fichier existe (commande test).

Arguments de la ligne de commande

Le programme suivant argv.c affiche les arguments qui lui sont passés sur la ligne de commande

int main(int argc, char *argv[]) {
    int i;
    fprintf(stderr, "   argc = %d\n", argc);
    for (i = 0; i < argc; i++)
        fprintf(stderr, "argv[%d] = %s\n", i, argv[i]);
    exit(EXIT_SUCCESS);
}

Ces quelques exemples d’exécution explicitent la manière dont les arguments de la ligne de commande sont gérés :

$ ./argv emacs  xclock
   argc = 3
argv[0] = ./argv
argv[1] = emacs
argv[2] = xclock
$ ./argv  "vim test.c" "xclock -update 1" xterm
   argc = 4
argv[0] = ./argv
argv[1] = vim test.c
argv[2] = xclock -update 1
argv[3] = xterm

Exercice 10
 (Redirection)   Il s’agit d’implanter une commande
to file cmd...
qui exécute les commandes cmd... les unes après les autres en redirigeant leur sortie standard vers le fichier file qui est éventuellement tronqué au début de l’exécution de to.

Exercice 11
 (Exécutions de commandes)   On désire implanter un programme do qui exécute indépendamment et simultanément une série de commandes Shell données sur la ligne de commande. L’exécution du programme se termine quand l’ensemble des commandes a terminé. Le programme retourne alors un statut formé de la conjonction (et, option -a (and)) ou de la disjonction (ou, option -o) des statuts retournés par les commandes selon la valeur de l’option. Par défaut (si l’utilisateur n’a précisé ni -a ni -o), on utilisera la conjonction. La syntaxe est la suivante :
do [-a|-o] command...
On utilise cette commande do suivant l’exemple suivant :
do -a emacs firefox xterm
Question 1   Implantez la commande do.

Une utilisation possible de la commande do est de ne s’intéresser qu’aux valeurs de retour des commandes lancées. Dans ce cas, il est possible de conclure sur la valeur de retour de la commande do dès qu’une des commandes retourne un succès (pour l’option -o, ou retourne un échec pour l’option -a) : on parle de conjonction ou disjonction coupe-circuit. Ce fonctionnement est activée par l’option -c de la commande do.

Question 2   Implantez cette option -c de la commande do.

Considérant l’option -c, une fois le résultat acquis, il n’est pas utile de laisser poursuivre les exécutions des commandes dont le résultat ne sera pas exploité. L’option -k, associée à -c, indique de tuer (kill) les commandes non encore terminées alors que le résultat de do a pu être déterminé.

Question 3   Implantez cette dernière option -k de la commande do.

Pour raffiner do, on désire que les commandes puissent accepter des paramètres et ainsi utiliser la commande de la manière suivante :

do -a "vim test.c" "xclock -update 1"
Question 4   Implantez cette extension de la commande do. Reportez-vous à l’encart explicitant la manière dont les arguments de la ligne de commande sont traités. Vous pourrez utiliser la bibliothèque makeargv fournie pour générer un tableau argv à partir d’une chaîne de caractères.

Validation de votre do

Vous mettrez au point un script permettant de valider votre do. Deux commandes seront particulièrement utiles pour la mise au point : true (qui fait juste un exit(EXIT_SUCCESS)) et false (qui fait juste un exit(EXIT_FAILURE)).

Vous testerez notamment :

Pour en faire un test automatique, vous pourrez taper :

./do -o true  true  || echo "Erreur: or true true a renvoyé false"
./do -o false false && echo "Erreur: or false false a renvoyé true"

qui n’affiche des messages qu’en cas d’échec d’un des tests, par un mécanisme similaire à celui de l’exercice 9 : dans les lignes de commandes cmd1 || cmd2, cmd2 n’est exécutée que si cmd1 a échoué ; dans cmd1 && cmd2, cmd2 n’est exécutée que si cmd1 a réussi.

Comme commandes qui durent plus longtemps que true et false, vous pourrez utiliser xterm (que vous pourrez fermer normalement). Vous pourrez aussi faire un petit programme presque aussi simple que false mais attendant quelques secondes avant de se terminer.


Précédent Table des matières