1.無名管道
int pipe(int pipefd[2]);
參數:
@pipefd 獲得操作管道的檔案描述符
傳回值:
成功傳回0, 失敗傳回-1
特點:
<1>.pipefd[0] 讀管道檔案描述符 ,pipefd[1] 寫管道檔案描述符
<2>.隻能親緣關系間程序通信(親緣關系程序存在資料拷貝)
練習:
父程序向管道中輸入資料,子程序從管道中讀取資料,然後輸出
當輸入"quit"的時候,父子程序結束
----------------------------------------------------------------------------
管道讀寫規則:
<1>寫端存在,讀管道
管道中有資料,讀取實際的資料,如果沒有資料,讀則阻塞
<2>寫端不存在,讀管道
管道中有資料,讀取實際的資料,如果管道中沒有資料,讀不阻塞,傳回 0
<3>讀存在,寫管道
管道空閑的時候,寫入資料,管道滿的時候,寫阻塞
<4>讀端不存在,寫管道
此時寫管道沒有意義,核心會發送SIGPIPE殺死寫管道的程序
2.有名管道
<1>可以實作任意程序間通信
<2>在檔案系統存在名字,是管道檔案,不占用磁盤空間
(1)建立有名管道檔案
int mkfifo(const char *pathname, mode_t mode);
(2)打開有名管道檔案
[1]隻讀方式打開有名管道文則阻塞,直到另一端以寫的方式打開
[2]隻寫方式打開有名管道文則阻塞,直到另一端以讀的方式打開
(3)通過read/write讀寫有名管道
注意:有名管道讀寫規則遵從無名管道的讀寫規則
A 程序和B程序聊天