2014年6月4日 星期三

pipe的用法

使用 pipe() 可建立一組雙向的管線,
通常會使用一個陣列來建立pipe
例:
int pfd[2];
這是一條水管,
從 pfd[0] 進入的東西會從 pfd[1] 出來,
反之亦然,
除此之外,
它也是可以跨 Process,
達成兩個程式溝通的目的。

實做上必須注意以下幾個重點

1.有複製,就要有關閉,一個dup2搭一個close,保持file descriptor的單純性
(此為血淚經驗談,自己實做就知道…)

2.fork出去的程式,沒用到的file descriptor一定要記得關
舉例來說,本來shell主程式裡面有一個pipe,若是此時fork出子程序來exec指令,主程序下wait指令等待子程序執行完畢且主程序沒有關閉pipe,則主程序會卡住。因為當fork的時候,一個pipe實際上會變成兩個pipe,當指派子程序接收pipe資料的時候,如果還有其他pipe沒有關閉,則子程序會判定pipe資料流尚未結束,而繼續癡癡等待輸入,若是主程序有pipe沒關閉的話,結果就是主程序在等子程序結束,子程序又在等待主程序的pipe輸入資料,造成死結。

參考:
C/C++, Linux, Web 相關技術, 程式心得筆記, 系統研發手札
pipe @ Linux Kernel
[程設] Linux C 的file descriptor以及pipe操作相關筆記(上)
[程設] Linux C 的file descriptor以及pipe操作相關筆記(下)