管道和重定向
輸入輸出不僅可以重定向到文件,也可以通過管道傳遞到其他進程中。
基本思路:
linux:
1. 創(chuàng)建管道對
pipe(int pipefd[2])
2. 創(chuàng)建進程
首先fork,然后子進程用dup2把pipefd[0]復(fù)制到STDIN_FILENO(就是0),然后關(guān)閉pipefd[1],或者把pipefd[1]復(fù)制到STDOUT_FILENO(就是1),然后關(guān)閉pipefd[0]。
之后調(diào)用exec去載入要創(chuàng)建的進程。
3. 讀或?qū)?/p>
用read或者write。注意讀寫之前要把子進程使用的那一個用close函數(shù)關(guān)閉掉。
區(qū)別在*nix創(chuàng)建進程分兩步,fork然后exec。windows只一步。
區(qū)別2,*nix要手工dup來復(fù)制文件描述符,windows在創(chuàng)建進程的API內(nèi)部做好了這件事。
linux步驟多一些,但是靈活,可以變化出多種模式來,例如fork之后,不僅僅子進程可以exec,父進程也可以exec,完完全全實現(xiàn)像“l(fā)s|wc -l”這樣的功能。也就是子進程用wc去替代,父進程用ls去替代。
windows步驟少,模式固定,它要實現(xiàn)上述功能,反而更加繁瑣,需要創(chuàng)建兩個進程,并把它們對接,然后等待兩個進程結(jié)束
實例:
題目:通過管道模擬shell命令:catfile | sort
涉及主要知識點:未命名管道、重定向
題目描述:具體模擬一個shell命令:cat file | sort。具體的一些提示在后面。
提示:首先在當前目錄下創(chuàng)建一個名為”file”的文件,里面的內(nèi)容輸入如下:
99
123
892
12
1342
89
32
76
通過執(zhí)行”cat file | sort”后的結(jié)果如下:
12
123
1342
32
76
89
892
99
現(xiàn)在我們需要通過一個管道,將”cat file”的結(jié)果通過管道送給命令”sort”。其中,將”cat file”命令的輸出結(jié)果重定向到”sort”命令的輸入是由包含在命令中的管道標志”|”來完成的。為了在程序當中實現(xiàn)類似的功能,需要用dup()或者dup2()系統(tǒng)調(diào)用將標準輸入和標準輸出聯(lián)系起來,具體的系統(tǒng)調(diào)用使用可以通過man手冊來查,或者查閱群共享里面的函數(shù)手冊。另外,這里的”cat file”和”sort”命令不是自己來完成,而是通過調(diào)用exec函數(shù)族來實現(xiàn)的。
******************************************************************************************************************************************
******************************************************************************************************************************************
我的源代碼如下:
流程圖:
1』pipe()創(chuàng)建管道、fork()創(chuàng)建子進程
注意: 關(guān)于這里 在父、子進程中都需要 close() 兩次 有待驗證!
心得:
原文:http://blog.csdn.net/markman101/article/details/7304979
1
子進程的功能是讀出信息,而父進程的功能是寫入信息;因此在子進程那里,要把管道的輸入端復(fù)制到標準輸出中,即dup2(fd[1],1)而父進程則要把管道寫端復(fù)制到標準輸入,即dup2(fd[0],0)。
2
dup()與dup2()的最大區(qū)別:
舉例說明:
所以dup2()是把close()和dup()這兩個函數(shù)集成在了同一個函數(shù)里。這里特別要注意的是:dup2()的兩個參數(shù),是把前一個復(fù)制到后一個里面,所以書上的例子中寫的是錯誤的。
3、還有就是exec()函數(shù)的用法,我一開始不知道“cat file“命令如何作為函數(shù)的參數(shù),現(xiàn)在談?wù)勎业睦斫獍桑?/p>
我的程序中execlp("cat","cat","file",NULL);第一個參數(shù)是為了指明該命令的路徑,第二個和第三個參數(shù)是該命令
所包含的所有參數(shù),即把他們一一羅列出來。