O重定向和管道:使用pipe、fork、exec詳解

要使who|sort用程序實現,需進行I/O重定向,參考了Unix/Linux編程實踐教程,畫了幾個圖來理解這個程序,可能會更好。

  1. 當運行pipe(pipe_id)以及fork之後,父進程和子進程共享stdin、stdout和管道,如圖所示:
多圖詳解I/O重定向和管道:使用pipe、fork、exec詳解

  1. 我們知道,可以設定子進程寫,父進程讀,也就是子進程執行who程序,通過寫管道口,輸出到父進程的讀管道口(這是沒有重定向的情況),於是萬惡的重定向來了,他告訴你可以進入管道,但是不是常規的那個門口進入,而是從另外一個門進入。但是管道還是管道,只是進出口不同而已,你懂得。

第一步:關閉子進程的讀管道口

多圖詳解I/O重定向和管道:使用pipe、fork、exec詳解

第二步:關閉子進程輸出流

多圖詳解I/O重定向和管道:使用pipe、fork、exec詳解

第三步:複製子進程寫管道口

多圖詳解I/O重定向和管道:使用pipe、fork、exec詳解

第四步:關閉子進程寫管道

多圖詳解I/O重定向和管道:使用pipe、fork、exec詳解

至此,成功實現子進程寫管道口角色的轉換,於是在子進程執行程序,執行比如who時,他以為他輸出到標準輸出流,其實他已經輸出到了些管道口。


  1. 同理,對父進程進行一系列類似的處理
多圖詳解I/O重定向和管道:使用pipe、fork、exec詳解

多圖詳解I/O重定向和管道:使用pipe、fork、exec詳解

多圖詳解I/O重定向和管道:使用pipe、fork、exec詳解

多圖詳解I/O重定向和管道:使用pipe、fork、exec詳解

至此成功實現角色轉換!


代碼

<code>#include "../apue.h" int main(int argc, char *argv[]){int pid, pipe_id[2], newfd;if(argc != 3)oops("usage: cmd need 3 paraments", 1);if(pipe(pipe_id) < 0)oops("pipe", 1);if((pid = fork()) < 0){oops("fork", 1);}else if(pid == 0)///子進程負責寫{close(pipe_id[0]);if(dup2(pipe_id[1], 1) == -1)oops("dup2", 1);close(pipe_id[1]);execlp(argv[1], argv[1], NULL);oops("execlp", 2);}else///父進程負責讀{close(pipe_id[1]);if(dup2(pipe_id[0], 0) == -1)oops("dup2", 1);close(pipe_id[0]);execlp(argv[2], argv[2], NULL);oops("execlp", 1);}exit(0);}/<code>

https://blog.csdn.net/yake25/article/details/7447086


分享到:


相關文章: