管道是第乙個廣泛應用的ipc(程序間通訊)手段。
管道特點:
對於管道中的read/write是與普通檔案所不同的,他們是會阻塞的。
那麼read和write函式什麼時候阻塞呢?
有名管道的建立
//可以通過mkfifo命令建立乙個管道檔案用於操作
//也可以通過mkfifo()建立有名管道,可以指定管道的路徑和開啟的模式.mkfifo()函式語法如下:
#include#includeint mkfifo(const char *filename,mode_t mode); //pathname管道檔案的路徑名,mkfifo()會依引數pathname建立特殊的fifo檔案,該檔案必須不存在,而引數mode為該檔案的許可權位數字,若成功則返回0,否則返回-1,錯誤原因存於errno中。
ps:mkfifo函式前要使用unlink(filename);
eg:unlink("fifo");
mkfifo("fifo",0777);
注意:下面我們來乙個有名管道的例子:
執行**之前先用命令在當前的資料夾建立命名管道檔案(也可以自己呼叫函式實現,在這裡我用命令建立。)
無名管道的建立管道是基於檔案描述符的通訊方式,當乙個無名管道建立時,它會建立兩個檔案描述符fds[0]和fds[1],其中fds[0]固定用於讀管道,而fd[1]固定用於寫管道,這樣就構成了乙個半雙工的通道.管道關閉時只需將這兩個檔案描述符關閉即可,可使用普通的close()函式逐個關閉各個檔案描述符.
//建立管道可以通過呼叫pipe()來實現
#includeint pipe(int fds[2]);//fds[2]是管道的兩個檔案描述符,之後可以直接操作這兩個檔案描述符,實際上pipe包含建立與開啟一體
兩個程序通過乙個pipe管道只能實現單向通訊,所以我們就需要在進行讀操作的程序中關閉其寫操作的檔案描述符,在進行寫操作的程序中關閉讀操作的檔案描述符。舉例:子程序讀父程序寫,就要關閉父程序的讀操作檔案描述符fds[0],關閉子程序的寫操作檔案描述符fds[1]。但如果有時候也需要子程序寫父程序讀,就必須另開乙個管道。
如果只開乙個管道,但是父程序不關閉讀端,子程序也不關閉寫端,雙方都有讀端和寫端,為什麼不能實現雙向通訊?
因為倆程序同時讀/寫,會造成資料混亂,因為讀寫指標只有乙個,但我們並不能保證讀寫的順序。
示例**:
無名管道的集中特殊情況:1:當讀乙個寫端被關閉的管道時,在所有資料被讀取完成後,read返回0,以指示達到了檔案結束處。
2:當讀乙個寫段未被關閉的管道,但寫段也並沒有資料寫入時,讀程序從管道中將資料讀完後並不會返回0,而是read阻塞,直到管道中有資料了讀取後才會返回
3:當寫乙個讀端被關閉的管道時,則寫段程序會收到訊號sigpipe,通常會導致程序異常終止,如果忽略該訊號或者捕捉該訊號並從其處理程式返回,則write返回-1。
4:當寫乙個讀端未被關閉的管道,且讀端並不會讀取管道中的資料,那麼寫端就一直往管道中寫,直到管道寫滿,write就會阻塞,直到管道中有空位才寫入資料並返回。
程序間通訊方式 管道通訊
c語言中的管道通訊是通過在核心中開闢一塊空間,使用者通過檔案io介面來訪問這塊空空間實現通訊目的。管道的優點是直接訪問記憶體,通訊速度較快。缺點是一方面管道屬於半雙工的通訊,即同一程序只能讀或者寫,無法同時讀寫同一管道。另一方面管道中的資料只能讀一次,無法重複讀取。程序通過檔案io來操作管道,但是不...
程序間通訊方式 管道
1.管道的建立 管道是由呼叫pipe函式來建立 include int pipe int fd 2 返回 成功返回0,出錯返回 1 是一種半雙工的通訊方式,資料只能單向流動,而且只能在具有親緣關係 父子程序 的程序間使用。2.有名管道和無名管道的區別 有名管道 可以在任意兩個程序之間,有名的名字存在...
程序間通訊方式介紹 管道
1.程序間通訊的方式 1 管道 一種兩個程序間進行單向通訊的機制,半雙工的通訊方式。資料只能單方向流動,而且只能在具有親緣關係 父子程序 兄弟程序 的程序間使用。從通訊的雙方資訊互動的方式分三種基本模式 單工通訊 單向通訊 只有乙個方向的通訊而沒有反方向的互動 資訊流是單方向的 傳送端和接收端的身份...