2017-02-14 33 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的AA」
grep的第i = 1
n = 2的

執行不會在「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

相關問題