#include
pipe
(int fd[2]
);
它由輸出型引數fd返回兩個檔案描述符,fd[0]為讀而開啟,fd[1]為寫而開啟,fd[1]的輸出是fd[0]的輸入,當管道建立成功後pipe函式返回0,如果建立失敗則返回-1,fd[0]和fd[1]之間的關係如下圖:
上面我們在單個程序中建立了管道,但是實際上,單個程序中的管道是沒有什麼用的,通常,程序會先呼叫pipe函式產生管道,接著呼叫fork()函式,fork函式會將父程序的相關資料結構繼承到子程序中,這樣就使子程序中的檔案描述符表中的fd[0]和fd[1]指向父程序所指向的管道檔案,這樣就能實現兩個程序之間的通訊了。上面的過程如下圖:
對於乙個從子程序到父程序的管道(子程序寫,父程序讀),父程序關閉fd[1],子程序關閉fd[0],當管道的一段被關閉後(在上面的基礎上關閉管道的一端)下列規則起作用:
1、當讀乙個寫端已經被關閉的管道時,
在所有的資料都被讀取後,read返回0(read返回0表示已經讀到檔案結束符);
2、如果寫乙個讀端已經被關閉的管道,
則會產生相關訊號對寫段的程序進行終止,如果忽略該訊號或捕捉該訊號並從處理程式返回,則write會返回-1,errno會設定為epipe;
3、如果管道的讀端和寫端都沒有關閉,但是管道的寫端沒有再向管道寫資料了。
這時如果管道中沒有資料了,那麼在此read程序會產生阻塞,直到管道中有資料了才讀取資料並返回。
4、如果有指向管道讀端的檔案描述符沒有關閉,而持有管道讀端的沒有從管道中讀資料, 這時有程序向管道中寫資料,如果管道被寫滿再向管道寫資料是,再次write會導致程序阻塞,直到管道中有空間了才會繼續向管道中寫資料並返回。
#include
#include
#include
#include
#include
#include
intmain()
pid_t id =
fork()
;if(id ==0)
close
(fd[1]
);exit(0
);}else
else
if(len ==0)
else
}close
(fd[0]
);int status =0;
pid_t _pid =
waitpid
(id,
&status,0)
;if(_pid == id)
else
perror
("wait");
exit(0
);}return0;
}
執行結果:
linux程式設計之pipe 函式
管道是一種把兩個程序之間的標準輸入和標準輸出連線起來的機制,從而提供一種讓多個程序間通訊的方法,當程序建立管道時,每次 都需要提供兩個檔案描述符來操作管道。其中乙個對管道進行寫操作,另乙個對管道進行讀操作。對管道的讀寫與一般的io系統函式一 致,使用write 函式寫入資料,使用read 讀出資料。...
linux程式設計之pipe 函式詳解
管道是一種把兩個程序之間的標準輸入和標準輸出連線起來的機制,從而提供一種讓多個程序間通訊的方法,當程序建立管道時,每次都需要提供兩個檔案描述符來操作管道。其中乙個對管道進行寫操作,另乙個對管道進行讀操作。對管道的讀寫與一般的io系統函式一致,使用write 函式寫入資料,使用read 讀出資料。in...
Linux網路程式設計之connect函式分析
在乙個 client server模型的網路應用中,客戶端的呼叫序列大致如下 socket connect recv send close 其中socket沒有什麼可疑問的,主要是建立乙個套接字用於與服務端交換資料,並且通常它會迅速返回,此時並沒有資料通過網絡卡傳送出去,而緊隨其後的connect函...