Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

[PIPE]programme qui se termine mal

2 réponses
Avatar
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\n", 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 :)

2 réponses

Avatar
Anthony Gelibert
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.
Avatar
Patrick Lamaizière
:

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 ?