實現在任意個程序之間創建管道

實驗目的:

實現一個程序,執行格式爲:./proc command1 … commandn

作用是在參數中指定的程序之間創建管道並執行這些程序

實驗原理:

循環的爲兩個程序之間創建管道並執行前一個程序:

+-------------+-------------+-------------+-------------+

|       p1      |       p2      |       ….     |       pn      |

+-------------+-------------+-------------+-------------+

                    ⬆                 ⬆                  ⬆

                   ①               ②                ③

主進程會fork出一個子進程:

主進程:爲自己的標準輸出創建管道並連到寫端,主進程的工作已完成,可以將自己替換爲p1並執行

子進程:將自己的標準輸入連到主進程創建的管道的讀端

此時①處應做的操作已經完成,p2相當於p1,可以循環執行

在③處的管道創建完成之後,就只需要將當前進程替換爲pn並執行

測試:

有三個程序用於測試:

a:分別向標準輸出輸出三個字符ABC,並在輸出之間睡眠一段時間以便觀察

b:從標準輸入循環讀取字符並隨即向標準輸出輸出字符

c:從標準輸入循環讀取字符並隨即向標準輸出輸出字符

爲得到三個進程每一步操作的順序,在每一次寫字符和讀字符的時候都獲取當前系統的時間並通過標準錯誤流輸出

實驗結果:

#write time 1544673891.433610#
#inter time 1544673891.589610#
#read time 1544673891.592173#
>Read>>
#read time 1544673891.595636#
I
#read time 1544673891.596860#
n
#read time 1544673891.598782#
t
#read time 1544673891.602652#
e
#read time 1544673891.603777#
r
#read time 1544673891.604423#
>
#read time 1544673891.606588#
A
#write time 1544673893.435466#
#inter time 1544673893.439350#
#read time 1544673893.441641#
B
#write time 1544673895.440165#
#inter time 1544673895.443178#
#read time 1544673895.445848#
C
#write time 1544673900.444004#

可以很明顯的看出,進程在運行期間通過管道交流,而不是後一個進程等待前一個執行結束之後纔可以開始執行

注意事項:

在測試程序中執行輸出的時候,需要在輸出之後fflush()一下,否則輸出的內容可能會被暫時緩衝起來而不立即輸出,造成前一個程序執行結束後面的程序才能讀到的假象。進程的緩衝策略可以被設置。

源代碼:

https://github.com/biaoJM/shell-pipe-simulate

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章