void pipe_execute(char all[][MAX_SIZE],int i,int n)
{
if(i==n)
{
execute(all[i-1]);
}
else
{
int fd[2];
char cmd1[100];
pipe(fd);
pid_t pid = fork();
if(pid==0)
{
dup2(fd[1],fileno(stdout));
execute(all[i-1]);
}
else
{
wait(NULL);
dup2(fd[0],fileno(stdin));
pipe_execute(all,i+1,n);
}
}
}
void execute(char cmd[])
{
char *a = strtok(cmd," ");
char *b = strtok(NULL," ");
pid_t pid = fork();
if(pid==0)
execlp(a,a,b,(char*)NULL);
else
{
wait(NULL);
}
}
Dans ce programme suppose
tous [0] = "ls"
tous [1] = "grep aa"
i = 1
n = 2
exécution de grep ne sera pas arrêtez après "grep a", peut-être attendez-vous à un caractère spécial, j'ai essayé tout comme '\ 0', '\ n', EOF etc mais cela n'a pas fonctionné. Que dois-je envoyer pour mettre fin à grep?Que dois-je transmettre en tant que caractère de fin aux commandes système telles que grep?
Vous devez fermer tous les descripteurs de fichiers parasites. En général, vous devriez faire 'pipe (fd); if (fork() == 0) {close (fd [0]); dup2 (fd [1], 1); close (fd [1]) ... 'Si l'un des processus a toujours une extrémité d'écriture du canal ouverte,' grep' continuera à attendre l'entrée. –