2017-02-14 22 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); 
    } 
} 

В этой программе предположим
все [0] = "LS"
все [1] = "Grep аа"
= 1
п = 2

Выполнение Grep не остановка после «grep a», может быть, она ждет какого-то особого символа, я пробовал все как «\ 0», «\ n», EOF и т. д., но это не сработало. Что я должен отправить в конец grep?Что я должен передавать как символ конца системным командам, таким как grep?

+0

Вы должны закрыть все дескрипторы бродячих файлов. В общем, вы должны делать 'pipe (fd); if (fork() == 0) {close (fd [0]); dup2 (fd [1], 1); close (fd [1]) ... 'Если какой-либо из процессов все еще имеет конец записи для открытого канала,' grep' будет продолжать ждать ввода. –

ответ

1

Это не останавливается, потому что он ждет ввода. Закройте его stdin, чтобы он ушел. Если он прикреплен к tty, отправьте ему Ctrl-D. Другой вариант - убить его соответствующим сигналом, но я не думаю, что вы этого хотите.

+0

закрытие stdin сработало, но как отправить Ctrl-D. –

+0

и для закрытия stdin я создал поток, который запускает этот исполняемый файл, и основной поток засыпает некоторое время и закрывает stdin. Есть ли лучший способ реализовать это? –

+0

Ну, обычно тот же процесс/поток, который отправляет данные в канал, закрывает поток, когда больше нет данных для отправки. Если этот подход не работает для вас, реализация тайм-аута, как вы это сделали, является вашим единственным оставшимся вариантом. – Dario