LE MULTIPIPE (oufffff plouffff :)

Apres avoir moi même galéré a essayé de comprendre le fonctionnement des pipes et surtout bien entendu du multipipe, j’ai décidé de publier un article sur ce sujet pour aider toutes personnes qui comme moi essaye de comprendre la subtilité des pipe et du multipipe.

C’est quoi un pipe.

Moi je dirai tout bêtement qu’un pipe est un canal de communication. (il permet d’échanger des informations).

Lorsque vous travailler sous linux, il existe ce qu’on appelle descripteur de fichiers http://fr.wikipedia.org/wiki/Descripteur_de_fichier.

Vous savez a présent que fd (file descriptor) 0 (zéro) représente l’entrée standard, le fd 1 (un) représente la sortie standard, et le fd 2 la sortie d’erreur.

Entrée Standard : CLAVIER (fd=0)

Sortie Standard : Ecran (fd=1)

Sortie d’erreur standard : Ecran (fd=2)

OUFFFFF revenons sur notre sujet à savoir les pipes.

ls | grep toto | wc;

 

 

ce truc pemmet de comprendre les pipes

schema pipe

création de pipe.

utiliser la fonction pipe.

int        pipe(int pipefd[2]);

faite un dup2.( remplacer la sortie standard par l’entrée de votre pipe)

dup2(pipefd[1], 1); maintenant le résultat du « ls » se trouve à la sortie de votre pipe.

Si vous faites un read sur la sortie de votre pipe vos récupérez le résultat de la commande « ls ».

read(pipefd[0], buff, 100);

write(1, buff, 100);

vous avez le resultat de la commende « ls ».

A la place du read faite un dup2 entre la sortie du pipe et l’entrée standard.

vous avez a nouveau le résultat de la commande ls sur la sortie standard.

faite un dup2 entre la sortie stantard et l’entrée d’un nouveau pipe, puis exécutez le grep toto. le grep utilisera le résultat de la commande ls pour rechercher la chaine de caractères « toto », puis son resultat va se trouver à la sortie du nouveau pipe.

faites un dup2 entre l’entré standard et la sortie de votre nouveau pipe.

il vous suffi de répéter cette opération tant qu’il reste des commandes à exécuter.

PLOUFFFF c’est comme ça qu’on gère le multipipe ?

 

C’est quoi dup2;

int dup2(int oldfd, int newfd);

dup2() transforme newfd en une copie de oldfd, fermant auparavant newfd si besoin est, mais prenez note des points suivants.

int main()

{ int pid;

int pipefd[2];

### on cree un pipe; pipe(pipefd);

### on cree un nouveau processus à patir du processu courant qui devient le père.

pid = fork();

### fork() crée un nouveau processus en copiant le processus appelant.

### Le nouveau processus, qu’on appelle fils (« child »), est une copie exacte

### du processus appelant, qu’on appelle pre ou parent.

if (pid == 0)

{

### si pid == 0 on est dans le fils;

### on fait un dup2 entre le sortir standard et ‘entrée du pipe;

close(pipefd[0]);

dup2(pipefd[1], 1);

### on exécute la commande ls;

execve(« /bin/ls », « ls »);

}

else

{

### on est dans le père;

wait(NULL);

close(pipefd[1]);

dup2(pipefd[0], 0);

pipe(pipefd);

pid = fork()

if (pid == 0)

{

dup2(pipefd[1], 1);

execve(« /bin/grep », « grep »);

}

else

{

wait(NULL);

dup2(pipefd[0], 0);

execve(« /usr/bin/wc », « wc »);

}

return (0);

}

 
bien vous pouvez toutes vos question et quelqu'un trouvera la reponse qui vous convient.

Une Réponse à “LE MULTIPIPE (oufffff plouffff :)”

  1. simbaste dit :

    donnez un point de vue

Laisser un commentaire

Le campus universitaire |
Moi, moche et ronde |
Diffluence |
Unblog.fr | Créer un blog | Annuaire | Signaler un abus | Lenouveauprof
| Foncierimmoconsult
| Dourdan Environnement