2017-02-14 4 views
1
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?

+0

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. –

Répondre

1

Il ne s'arrête pas car il attend l'entrée. Fermez le stdin pour le quitter. S'il est attaché à un tty, envoyez-lui Ctrl-D. Une autre option est de le tuer avec un signal approprié, mais je ne pense pas que vous le vouliez.

+0

fermeture stdin a fonctionné, mais comment envoyer Ctrl-D. –

+0

et pour fermer stdin, j'ai créé un thread qui exécute cette exécution et thread principal dort pendant un certain temps et ferme le stdin. Y a-t-il une meilleure façon de mettre en œuvre cela? –

+0

Eh bien, généralement le même processus/thread qui envoie des données à un tuyau ferme le flux lorsqu'il n'y a plus de données à envoyer. Si cette approche ne fonctionne pas pour vous, la mise en œuvre d'un délai d'attente, comme vous l'avez fait, est votre seule option restante. – Dario