linux程式設計之pipe 函式

2021-09-01 11:55:19 字數 1664 閱讀 5042

#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函...