pipe 半雙工 linux pipe使用小結

2021-10-13 14:21:15 字數 927 閱讀 3963

pipe作為linux中最基礎的程序間通訊機制,經常在shell中使用,例如ps aux | grep aaa 即建立了乙個管道,而linux 下c程式同樣可以通過系統呼叫pipe在父子程序間使用管道功能。

pipe函式原型如下:

#include

int pipe(int pipefd[2]);

通過函式引數返回兩個描述符(fd),pipefd[0] 用來讀,pipefd[1]用來寫, 寫入到pipefd[1]的資料將可以從pipefd[0]讀出,管道作為半雙工通道,資料只能沿乙個方向前進;

pipe函式返回0表示呼叫成功,返回-1表示呼叫失敗;

讀取乙個空的pipe將導致read操作阻塞,直到有資料被寫入到pipe中;向乙個已經滿的pipe寫資料將導致write操作阻塞,直到pipe中的資料被讀取出去;

如果想避免read和write阻塞,可通過fcntl將pipefd設定成o_nonblock,read和write無論是否成功,都將直接返回,這時需要判斷read和write返回錯誤碼,判斷操作是否成功。

如果有多個程序同時向乙個pipe寫入時,只有在每個程序寫入的資料長度都小於pipe_buf時,才可以保證pipe寫入的原子性,不然可能會出現資料錯亂的情況;

管道作為半雙工通道,如果想實現雙向通訊,則需要開啟兩個管道,乙個從父程序->子程序,另乙個從子程序->父程序。

#include

void server(intwfd) void client(intrfd) int main(int argc, char **ar**) if(cpid == 0) else return 0;

以上示例完成了最基本的pipe程序間通訊,父程序fork出子程序,子程序會繼承父程序開啟著的pipefd描述符,子程序關閉pipefd[1],保留pipefd[0]用來寫入;

而父程序關閉pipefd[0],保留pipefd[1]用來寫入。

pipe 半雙工 管道為什麼是半雙工的呢?

linux的管道實現是個環形緩衝區 struct pipe buffer a linux kernel pipe buffer page the page containing the data for the pipe buffer offset offset of data inside the...

全雙工半雙工

單工 單工就是指a只能發訊號,而b只能接收訊號,通訊是單向的,就象燈塔之於航船 燈塔發出光訊號而航船只能接收訊號以確保自己行駛在正確的航線上。半雙工 指乙個時間段內只有乙個動作發生,舉個簡單例子,一天窄窄的馬路,同時只能有一輛車通過,當目前有兩量車對開,這種情況下就只能一輛先過,等到頭兒後另一輛再開...

pipe實現單工和半雙工模式

其實網上用pipe的python 所謂的全雙工,其實都是半雙工。單工模式 import sys reload sys sys.setdefaultencoding utf 8 import multiprocessing import time def proc1 pipe while true f...