Re: fonction systeme: "communication" avec le shell

Page principale

Répondre à ce message
Auteur: Pierre Pronchery
Date:  
À: guilde
Sujet: Re: fonction systeme: "communication" avec le shell
On Wed, 2002-10-30 at 17:24, Edgar Bonet wrote:
> 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);
>


c'est pas mieux d'utiliser fcntl() a dup2()?

--
Pierre