[PIPE]programme qui se termine mal

Le
philuxNO
Salut à tous, je suis en train de devellopper un shell UNIX, et je
bloque un peu sur les pipes.
Donc j'ai écris un programme tout simple qui simule un
'ls -l | grep main'

Voilà le code :


#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>

int exec_grep(int i)
{
int p[2];
int status;
pid_t pid;
pipe(p);
printf("pid = %d", getpid());
pid = fork();
if (pid > 0)
{
/* FILS */
if(i == 0)
{
close(p[0]);
close(1);
dup(p[1]);
execlp("ls", "ls", "-l", NULL);
}
else
execlp("grep", "grep", "main", NULL);
exit(127);
}
else if(pid != -1)
{
/* Père */
if(i == 0)
waitpid(pid, &status, WNOHANG);
else
wait(NULL);
if(i == 0)
{
close(p[1]);
close(0);
dup(p[0]);
exec_grep(1);
}
else
exit(status);
}
return 0;
}

int main(void)
{
int i = 0;
exec_grep(i);
return 0;
}



/*************************/



Le code est assez simple, au premier appel de exec_grep on ouvre les
pipes, puis au second, on execute le grep.

Le problème c'est que parfois le programme s'execute bien, mais parfois
il bloque, il ne se termine pas normalement, je tape une fois entrée et
il se termine. Bref, je voudrais savoir ce qui cloche dans mon petit
bout de programme, je suis programmeur débutant, donc si vous avez une
meillieure manière de procéder pour faire un pipe.

Merci :)
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Anthony Gelibert
Le #17498081
La commande fork renvoie l'entier suivant lors de l'appel :
-1 : erreur de création du nouveau processus
0 : pour le fils
n>0 : pour le pere (c'est le numero du processus fils)
Donc dès le départ il y a un problème dans ton code.
Patrick Lamaizière
Le #17502021
:

Le code est assez simple, au premier appel de exec_grep on ouvre les
pipes, puis au second, on execute le grep.



Je dis ça je dis rien mais euh la fonction exec_grep ne fait pas un grep
tout le temps ?

Ce serait pas plus lisible d'avoir plusieurs fonctions qui font ce que
leur nom indique ?
Publicité
Poster une réponse
Anonyme