2016-01-12 1 views
2

Programme:Rediriger le résultat de la fonction execl

#include<stdio.h> 
#include<unistd.h> 
#include<stdlib.h> 
int main() 
{ 
     int cpid=fork(); 
     if(cpid==0){ 
       execl("/bin/ls","ls","-lah","--color",NULL); 
     } 
     else{ 
       int status; 
       waitpid(cpid,&status,0); 
       if(status!=0) 
         printf("Error Occured\n"); 
     } 
return 0; 
} 

Sortie:

$ ./a.out 
total 20K 
drwxrwxr-x 1 guest guest 4.0K Jan 12 15:21 . 
drwxrwxr-x 1 guest guest 4.0K Jan 12 15:21 .. 
-rwxrwxr-x 1 guest guest 7.2K Jan 12 15:19 a.out 
-rw-rw-r-- 1 guest guest 372 Jan 12 15:20 execl.c 
$ 

Dans le programme ci-dessus, parent créer un enfant et l'enfant exécuter la commande ls. Mais, mon exigence est de sauvegarder la sortie de ls dans un tableau dans le parent. Est-ce qu'il y a un moyen de faire ça.

Répondre

3

exec*() les fonctions de la famille remplacent les du processus actuel avec un nouveau. Donc vous ne pouvez pas le lire directement. Vous n'avez pas besoin d'un processus fils pour lire la sortie d'une commande externe. Vous pouvez utiliser popen() pour y parvenir.

Si vous devez devez créer un processus enfant, vous pouvez utiliser pipe(2) pour lire à partir de la sortie du processus enfant. Vous pouvez trouver un exemple simple sur la page de manuel liée.

+0

* "Vous n'avez pas besoin d'un processus fils pour lire la sortie d'une commande externe." * Peut-être que je suis pédant, mais que pensez-vous que le "popen" fait sous le capot? –

+0

Peut-être que vous n'avez pas besoin de "en créer un vous-même" peut être précis. Mais je vais nourrir les trolls et les pédants, je peux être ici toute la journée. Je m'attendrais à ce que tout le monde regarde la page de manuel liée avant de l'utiliser pour comprendre ce que fait la popen. –

1

Pour utiliser popen() est une possibilité, mais si vous voulez aller avec fork()/exec*(), vous feriez ceci:

Avant la fork(), créer un tube et l'attacher à stdout chez l'enfant

int fds[2]; 
pipe(fds); 

Après la fourche, dans le processus de l'enfant fermer la lecture fd et fixer le fd écrire à stdout:

close(fds[0]); 
dup2(fds[1], 1); 
close(fds[1]); 

Dans le processus parent, fermez la fd écriture et de lecture de la lecture fd pour obtenir la sortie:

close(fds[1]); 
read(fds[0], buf, sizeof(buf)); 

Si vous avez besoin en mémoire tampon, vous pouvez appeler fdopen() sur la lecture fd dans le processus parent.