Re: fonction systeme: "communication" avec le shell

Page principale

Répondre à ce message
Auteur: Edgar Bonet
Date:  
À: guilde
Sujet: Re: fonction systeme: "communication" avec le shell
Le mercredi 30 octobre, marc_chachereau@??? a écrit :
> j'appelle la fonction system("ls") ('ls' est un exemple) dans un programme
> en C et j'aimerais savoir comment récupérer le résultat de la commande
> (dans notre cas la liste des fichiers) à partir du même programme sans
> passer par la redirection dans un fichier.


Gwenn Gueguen t'a donné la solution (popen). Je réagis seulement à la
phrase ci-dessous :

> Il faudrait que la solution soit légère et performante (en évitant un
> fork par exemple).


Sans fork() c'est pas possible. En fait, quand tu fais system("ls"), la
fonction system() fait un fork() pour lancer la commande "/bin/sh -c
ls". Tu lances donc un shell qui va a son tour lancer la commande que tu
demandes. C'est la même chose lorsque tu fais popen().

Si tu veux gagner en performance, tu peux te passer du shell. Il faut
alors que tu fasses les choses toi-même à la main :

    FILE *simple_popen(char *command)
    {
        int fd[2];


        pipe(fd);
        if (!fork()) {
            dup2(fd[1], 1);
            close(fd[0]);
            close(fd[1]);
            execlp(command, command, NULL);
        }
        close(fd[1]);
        return fdopen(fd[0], "r");
    }


Remarque que si ta commande a des arguments, il faut que tu les sépares
dans l'appel à execlp : execlp("ls", "ls", "-l", NULL);

Edgar.

-- 
Edgar Bonet                         Tél    : 04 76 88 10 96
Laboratoire Louis Néel -- CNRS      Mobile : 06 77 19 79 39
25 av. des Martyrs, BP 166          Fax    : 04 76 88 11 91
38042 Grenoble cedex 9, France      e-mail : guilde@???