Linux 之管道通訊

2021-08-25 19:49:47 字數 2754 閱讀 8460

管道通訊使用先入先出的原則進行讀寫,且不能是lseek函式定位讀寫位置。

(1)無名管道,無名管道是一種特殊型別的檔案,完全由作業系統管理和維護,因為其儲存位置只有親緣關係的程序知道,所以只能用於親緣關係的程序之間通訊,而且,其核心資源會在兩個通訊程序退出後自動釋放,無名管道建立函式為:

//from /usr/include/unistd.h

int pipe(int fd[2]);

函式pipe()返回兩個檔案描述符,其中fd[0]用來完成讀操作,fd[1]完成寫操作,預設阻塞方式。

以阻塞方式讀管道時:

(1)有讀程序,無寫程序:

管道內無資料時,立即返回

管道內資料不足,讀出所有資料

管道內資料充足,讀出期望資料

(2)有讀程序,有寫程序:

以阻塞方式寫管道時:

(1)有寫程序,無讀程序:

(2)有寫程序,有讀程序,且管道內有寫空間:

另外可以使用fcntl()函式使用o_ndelay或o_nonblock屬性,設定管道為非阻塞模式。

(2)有名管道

有名管道可以通過mknod 命令建立,也可以使用函式mkfifo()建立,可以使用在系統中任意兩個程序之間進行通訊,且建立的管道檔案儲存在硬碟上,不會隨著程序結束而消失。mknod使用如下:

root@wangmumu-virtual-machine:/home/wangmumu/桌面/shares/fifo# mknod fifo p

root@wangmumu-virtual-machine:/home/wangmumu/桌面/shares/fifo# ls -l

總用量 24

prw-r--r-- 1 root root 0 8月 26 00:30 fifo

-rwxr--r-- 1 nobody nogroup 872 8月 25 23:57 fifo_read.c

-rwxr--r-- 1 nobody nogroup 884 8月 25 23:52 fifo_write.c

-rwxr-xr-x 1 root root 7613 8月 25 23:57 read

-rwxr-xr-x 1 root root 7651 8月 25 23:52 write

可以看出已經建立了管道檔案fifo。

函式宣告如下:

// from /usr/include/sys/stat.h

int mkfifo(char* path,mode_t mode);

函式的第乙個引數為有名管道檔案,函式呼叫時,必須不存在,執行成功返回0,失敗返回-1。

(1)當程序以寫或讀的方式開啟管道檔案,必須有另乙個程序以相對應的讀或寫方式也開啟該檔案,否則該程序將阻塞在open()位置。

(2)若兩個程序都已開啟,但中途某程序退出,則:

讀程序退出,返回sigpipe訊號

寫程序退出,讀程序將不再阻塞,直接返回 0

以下為有名管道**實現,寫程序不斷獲取終端輸入,並寫到有名管道上,讀程序阻塞讀取管道中資料,並將資料列印出來:

寫程序**實現:

#include #include #include #include #include #include #include #include #define fifo_name "fifo"

int main();

if(access(fifo_name,f_ok) == -1) }

printf("mkfifo success,open o_wronly!\n");

fd = open(fifo_name,o_wronly);

if(fd < 0)

else

memset(buffer,0,sizeof(buffer));

sleep(1);

} }

close(fd);

return 0;

}

讀程序**實現:

linux管道通訊之匿名管道

管道檔案的大小始終是為0,更多的時候,它只是起乙個標識作用,標識核心中的那塊快取區。就會出現所謂的匿名管道 比如父子程序之間的通訊 使用pipe建立匿名管道,看不到pipe檔案。pipe int fds 2 fds 0 讀,fds 1 寫 返回2個檔案描述符,乙個讀檔案描述符,乙個寫檔案描述符。匿名...

linux程序通訊之管道

管道 可分為普通管道和命名管道。普通管道用於有親緣關係的程序間的通訊 父子程序 命名管道,通過給管道命名的方式,使得管道變成檔案系統中的管道檔案,從而允許無親緣關係的程序間通過訪問管道檔案進行通訊。管道是單向的,一端只能用於輸入,另一端只能用於輸出。管道是fifo的,即先進先出的,向管道中寫入的資料...

Linux 程序通訊之管道

管道是單向的 先進先出的,它把乙個程序的輸出和另乙個程序的輸入連線在一起。乙個程序 寫程序 在管道的尾部寫入資料,另乙個程序 讀程序 從管道的頭部讀出資料。資料被乙個程序讀出後,將被從管道中刪除,其他讀程序將不能再讀到這些資料。管道提供了簡單的流控制機制,程序試圖讀空管道時,程序將阻塞。同樣,管道已...