Previous Up

3  Mutation de processus


Exercice 8
 (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 liste de commande

#include <stdio.h>
#include <stdlib.h>

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  xterm
   argc = 4
argv[0] = ./argv
argv[1] = emacs
argv[2] = xclock
argv[3] = xterm
% ./argv  "emacs -u phm" "xclock -update 1" xterm
   argc = 4
argv[0] = ./argv
argv[1] = emacs -u phm
argv[2] = xclock -update 1
argv[3] = xterm

Bibliothèque de gestion de multiples commandes à arguments

La bibliothèque makeargv installée dans /home/enseign/PDS/*/ fournit deux fonctions de création et destruction d’arguments :

extern int makeargv(const char *s, const char *delimiters, char ***argvp);
extern void freeargv(char **argv);

Vous vous inspirerez de l’exemple suivant makeargv-main.c pour utiliser cette bibliothèque :

#include "makeargv.h"

int
main (int argc, char *argv[])
{
    int i, status;
    
    for (i=1; i<argc; i++) { /* traiter argv[i] */
        char **cmdargv;
        char **arg;

        /* création du argv de l'argument i */
        status = makeargv(argv[i], " \t", &cmdargv);
        assert(status>0);

        /* test: affichage */
        fprintf(stderr, "[%s]\t%% ", cmdargv[0]);
        for (arg=cmdargv; *arg; arg++)
            fprintf(stderr, "%s ", *arg);
        fprintf(stderr, "\n");

        /* libération mémoire */
        freeargv(cmdargv);
    }

    exit(EXIT_SUCCESS);
}

Une exécution de ce programme d’exemple est la suivante :

% ./makeargv-main "cat -n" "grep -v foo" wc 
[cat]   % cat -n 
[grep]  % grep -v foo 
[wc]    % wc 


Exercice 9
 (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 10
 (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, défaut) ou de la disjonction (ou) des statuts retournés par les commandes selon la valeur de l’option. La syntaxe est la suivante :
do [--and|--or] command...
On utilise cette commande do suivant l’exemple suivant :
do --and emacs mozilla xterm
Question 1   Implantez la commande do.

On désire que les commandes lancées par la do puissent accepter des paramètres et ainsi utiliser la commande de la manière suivante :

do --and "emacs -u phm" "xclock -update 1" xterm
Question 2   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 décrite dans l’encart pour gérer les paramètres de la ligne de commande.

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 --or, ou retourne un échec pour l’option --and) : on parle de conjonction ou disjonction coupe-circuit. Ce fonctionnement est activée par l’option --cc de la commande do.

Question 3   Implantez cette option --cc de la commande do.

Considérant l’option --cc, 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 --kill, associée à --cc, indique de tuer (kill) les commandes non encore terminées alors que le résultat de do a pu être déterminé.

Question 4   Implantez cette dernière option --kill de la commande do.

[fin provisoire du sujet...]


Previous Up