匿名管道
管道是一種簡單的程序通訊(ipc)機制。管道實質上就是pipe函式在核心中開闢了一段緩衝區,有乙個讀端和乙個寫端。兩個程序之間能夠通訊的本質:通過fork函式傳遞檔案描述符(子程序是父程序的副本,父程序所有開啟的檔案描述符都被複製到子程序中,父子程序的每個相同的開啟描述符共享乙個檔案表項)使得兩個程序可以訪問同乙個管道,從而實現通訊。
特點:單向通訊(若實現雙向通訊,必須建立兩個管道);
適用於有血緣關係的程序之間,尤其指父子程序;
面向資料流的服務;
生命週期隨程序;
使用管道(阻塞i/o操作)的特殊情況:
寫端都關閉,讀端讀取完後返回零;
寫端未關閉但不進行寫入,讀端讀取資料後陷入阻塞,直至有資料寫入需要讀取;
讀端都關閉,在寫端進行寫入資料的程式會收到sigpipe訊號,使得程式異常退出;
讀端未關閉但不進行讀取,寫端將緩衝區寫滿後陷入阻塞。
注:設定o_nonblock標誌,可設定為非阻塞。
#include
#include
#include
#include
int main()
; if(pipe(pipefd)<0)
pid_t id = fork();
if(id < 0)
else
if(id == 0)
close(pipefd[1]);
exit(3);
}else
else
{}count--;
}close(pipefd[0]);
exit(5);
}return
0;}
命名管道
命名管道是為了解決匿名管道只適用於有血緣關係的程序之間通訊的缺陷而設計的。不同於匿名管道的是它提供了乙個路徑名與其相連,以fifo的檔案形式存在於檔案系統中。這樣即使兩程序不存在血緣關係,但也可以通過訪問該路徑,實現彼此相互通訊。
命名管道的建立
在shell下互動地建立乙個命名管道;
命令:mknod namedpipe
使用系統函式mkfifo/mknod;
int mkfifo(const char* path,mode_t mod,dev_t dev);
其中path是建立的命名管道的全路徑名;mod為建立的命名管道的模式,指明其許可權;dev為裝置值,該值取決於檔案建立的種類。
mkfifo(「/code/fifo」,s_ififo|0666) ; //第二個引數指明建立乙個命名管道且訪問許可權為0666。(注意umask對生成的管道檔案許可權的影響)
命名管道使用前,必須先呼叫open()將其開啟,需要注意的是該程序可能被阻塞,但是如果使用讀寫方式開啟,則一定不會導致阻塞。
我們也可以使用下面函式建立命名管道:
mkfifo(const char* filename,mode_t mode); //建立乙個真實存在於檔案系統中的檔案。
兩種管道的比較:
命名管道是乙個存在於硬碟上的fifo檔案,而匿名管道是存在於記憶體的特殊檔案;
命名管道是雙向通訊,匿名管道是單向通訊;
命名管道可用於網路通訊;
命名管道有兩種模式(位元組流/位元組),匿名管道是面向資料流的;
兩者的生命週期都是隨程序(缺陷);
兩者的每條訊息的最大長度都是有上限的(缺陷);
//client
#include
#include
#include
#include
#include
#include
int main()
int fd = open("./fifo",o_rdonly);
if(fd < 0)
char buf[128];
while(1)
else
if(s == 0)
else
}return
0;}
//server
#include
#include
#include
#include
#include
#include
int main()
while(1)
buf[s] = 0;
write(fd,buf,sizeof(buf)-1);
}close(fd);
return
0;}
程序通訊 命名管道
handle winapi createnamedpipe in lpctstr lpname,名稱 必須為 pipe pipename格式,表示本地主機,如需聯網,就用主機名 in dword dwopenmode,開啟方式這裡用雙工pipe access duplex in dword dwpi...
父子程序通過管道通訊 命名管道
unix程式設計。建立了兩個命名管道,利用這兩個管道實現父子進城的通訊。即父程序可以像子程序傳送訊息,可以讀取子程序的訊息。子程序一樣。下面是全部原始碼。include include include include include include include include include i...
程序通訊 命名管道 FIFO
一.命名管道 fifo fifo不同於管道之處在於它提供一 個路徑名與之關聯,以fifo的檔案形式儲存於檔案系統中。命名管道是乙個裝置檔案,因 此,即使程序與建立fifo的程序不存在親緣關係,只要可以訪問該路徑,就能夠通過fifo 相互通訊。值得注意的是,fifo rst input rst out...