2012-09-09 59 views
2

有人可以解釋命令內部實際發生了什麼(系統調用稱爲)ls | grep 'xxx'流水線如何工作?

+4

使用'strace'來查找系統調用,例如'strace -f bash -c'ls | grep xxx'' –

回答

2

第一個命令的標準輸出作爲標準輸入輸入到管道中的第二個命令。有幾個系統調用,您可能有興趣瞭解更多詳細信息,特別是fork(2),execve(2),pipe(2),dup2(2),read(2)和write (2)。

實際上,shell將STDIN_FILENO和STDOUT_FILENO分別設置爲管道的讀端和寫端。當流水線中的第一個進程執行寫操作(2)時,該進程的標準輸出被複製爲管道的寫端,類似地,當第二個進程對標準輸入進行讀(2)時,它最終從管道的讀取結束。

當然還有更多細節需要考慮,請查看Richard Stevens在UNIX環境下的高級編程等書籍。

3

首先,調用pipe(2,3p)以創建具有讀寫結束的管道。然後調用fork(2,3p)兩次,每次命令一次。然後使用dup2(2,3p)來替換管道每端的每個分叉子節點中的相應文件描述符。最後在每個孩子中調用exec(3)以實際運行命令。