普通管道和命名管道

2021-07-16 04:00:09 字數 2019 閱讀 9575

(2116)

(0)管道分為普通管道和命名管道;兩者都是半雙工的。

普通管道只能用於父子程序或兄弟程序間的通訊,因為普通管道通過fork呼叫來拷貝檔案描述符的,在檔案系統中,普通管道並不對應物理檔案。

命名管道在檔案系統中有物理檔案存在,因此可以用於非親屬的程序間通訊。

#include

int pipe(int fd[2])

用於建立管道,建立後fd[0]和fd[1]在同乙個程序用,再用fork系統呼叫產生子程序,父子程序乙個關閉讀端fd[0],另乙個關閉寫端fd[1],之後就可以用於通訊了,用普通的i/o函式read、write、close即可。

如果管道輸入端關閉,從管道讀資料會以為讀到了資料的末尾,讀函式返回讀到的位元組數為0。

向管道寫資料時,如果管道緩衝區有空閒,則會寫入,否則一直阻塞。管道的緩衝區在記憶體,是有限的,一般為緩衝區分配乙個頁面的大小。如果管道讀端關閉,則寫資料會出錯,產生訊號sifpipe。

管道傳輸的是無格式的位元組流,用管道通訊時雙方要約定好資料格式。

在shell中使用|就是用了管道通訊,如經常使用的grep操作。

[cpp]

view plain

copy

#include

#include

#include

#include

char

readbuf[100];  

char

writebuf[100];  

intmain()  

if(pid==0)

//子程序

else

if(pid>0)

//父程序

return

1;  

}  

命名管道以檔案的形式存在於檔案系統中,及時無親緣關係的程序在系統中開啟該檔案即可通訊。命令管道遵守fifo先進先出,對命名管道讀

總是從開始處返回資料,對它寫則是新增到末尾,不支援lseek等操作。

#include

#include

int mkfifo(const char * pathname, mode_t mode)

建立命名管道用mkfifo,第乙個引數是路徑,第二個引數是模式,與open相同。如果第乙個引數是已存在的路徑名,則會出錯返回eexist。用i/o操作

函式即可操作命名管道,只是比普通管道多了個open操作。

命名管道不同於普通檔案,命名管道開啟時,要有兩個程序,乙個讀乙個寫來開啟。

如果當前程序開啟操作是為讀而開啟fifo時,若已經有相應程序為寫而開啟該fifo,則當前開啟操作將成功返回;否則,可能阻塞直到有相應程序為寫而開啟該fifo(當前開啟操作設定了阻塞標誌);或者,成功返回(當前開啟操作沒有設定阻塞標誌)。

如果當前程序開啟操作是為寫而開啟fifo時,如果已經有相應程序為讀而開啟該fifo,則當前開啟操作將成功返回;否則,可能阻塞直到有相應程序為讀而開啟該fifo(當前開啟操作設定了阻塞標誌);或者,返回enxio錯誤(當前開啟操作沒有設定阻塞標誌)

在管道使用完後,用unlink刪除管道。

fifo1.c建管道,寫資料

[cpp]

view plain

copy

#include

#include

#include

#include

#define path "/tmp/namedpipe"

char

buf[100];  

intmain()    

fifo2.c讀管道資料,之後刪除管道

[cpp]

view plain

copy

#include

#include

#include

#include

#define path "/tmp/namedpipe"

char

buf[100];  

intmain()  

unlink(path);  

return

1;  

}  

命名管道和匿名管道

我們知道程序間是可以通訊的。可以達到資料傳輸 資源共享 事件通知 程序控制等目的。程序間通訊主要包括管道 系統ipc,套接字等。管道分為三種 1 普通管道 int pipe int fds 2 返回值0表示成功,1表示失敗 fd 0 讀 fd 1 寫 子程序往管道中寫資料,寫資料時要關閉讀端 父程序...

linux的管道和命名管道

看了個教程,感覺還是要結合 看。管道是linux裡面程序間通訊的一種方式,其他的還有像訊號 signal 訊號量 訊息佇列 共享記憶體 套接字 socket 等。1.管道pipe int pipe int fd 2 返回值 成功,返回0,否則返回 1。引數陣列包含pipe使用的兩個檔案的描述符。fd...

命名管道 匿名管道

有名字 則可以通過 名字 開啟相同的管道進行通訊,沒有名字 在核心中沒有明確標識 只能通過 子程序複製父程序的方式實現通訊,複製了檔案描述符 匿名管道只能用於具有親緣關係的程序間通訊。只要在建立程序之前建立管道,後邊的程序都可以實現通訊。命名管道可用於同一主機任意程序間通訊 作業系統在核心提供的一塊...