2012-11-10 144 views
1

的目標考慮下面的源,減小爲簡單起見「多個」管道命令中斷的bash

int main() 
{ 
    int d[2]; 
    pipe(d); 
    if(fork()) 
    { 
    close(1); 
    dup(d[1]); 
    execlp("ls", "ls", NULL); 
    } 
    else 
    { 
    close(0); 
    dup(d[0]); 
    execlp("cat", "cat", NULL); 
    } 
} 

所以它創建一個管道和輸出從lscat重定向。

它工作得很好,沒有問題。但改變catmore和bash休息。

的症狀是:

  • 你沒有看到任何你鍵入
  • 按「ENTER」顯示了一個新的提示,而不是在一個新的生產線,但在同一個
  • 你可以執行任何命令並看到輸出
  • reset有助於解決問題。

因此,鍵盤輸入存在問題,它在那裏,但不可見。

這是爲什麼?

UPDATE:

  • ls | more輸出相當於我的程序的輸出
  • more過程沒有完成,它是由ls
  • 唯一可見的問題,孤兒是狀態父進程退出後的控制檯在某些系統上退出
  • 確實按預期工作。例如,在OpenSUSE上,我在Kubuntu上沒有問題。我找不到,我應該尋找什麼區別的任何信息,more二進制文件是在兩個系統上
+0

它在我的系統上正常工作,具有'more' .. – Omkant

+0

有趣。在我的其他系統上它也可以工作。所以它適用於OpenSUSE,但不適用於Kubuntu。這更糟糕:/ –

+0

立即更新。 –

回答

0

因爲不像catmore是需要超過stdinstdoutstderr交互式程序不同 - 它需要您的系統調用不能提供的終端。嘗試在管道或腳本中運行more,看看會發生什麼。

另請注意,bash在這裏不涉及任何階段,execlp函數調用將當前進程替換爲另一個被指定爲參數的進程。

+0

那麼'ls |更多'給我與'ls |相同的結果貓',爲簡短的輸入。當然,我知道這兩者之間的區別。正如我在評論中提到的那樣,它在SUSE上按照預期工作,但在Kubuntu上它卻沒有。不同的實現,也許不同的環境? 我已經提到過'bash',因爲在父進程完成後,結果是可觀察的。孩子的過程依然存在。爲什麼?它是否嘗試讀取終端的大小並未能檢測到輸出足夠? –