管道通訊使用先入先出的原則進行讀寫,且不能是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 程序通訊之管道
管道是單向的 先進先出的,它把乙個程序的輸出和另乙個程序的輸入連線在一起。乙個程序 寫程序 在管道的尾部寫入資料,另乙個程序 讀程序 從管道的頭部讀出資料。資料被乙個程序讀出後,將被從管道中刪除,其他讀程序將不能再讀到這些資料。管道提供了簡單的流控制機制,程序試圖讀空管道時,程序將阻塞。同樣,管道已...