一、概念
匿名管道的乙個不足之處是沒有名字,因此,只能用於具有親緣關係的程序間通訊,在命名管道(named pipe或fifo)提出後,該限制得到了克服。 fifo不同於管道之處在於它提供乙個路徑名與之關聯,以fifo的檔案形式儲存於檔案系統中。命名管道是乙個裝置檔案,因此,即使程序與建立fifo的程序不存在親緣關係,只要可以訪問該路徑,就能夠通過fifo相互通訊。值得注意的fifo(first input first output)總是按照先進先出的原則工作,第乙個被寫入的資料將首先從管道中讀出。
二、命名管道的建立與讀寫
linux下有兩種方式建立命名管道。一是在shell下互動地建立乙個命名管道,二是在程式中使用系統函式建立命名管道。shell方式下可使用mknod或mkfifo命令,下面命令使用mknod建立了乙個命名管道:
mknod namedpipe
建立命名管道的系統函式有兩個:mknod和mkfifo。兩個函式均定義在標頭檔案sys/stat.h中,函式原型如下:
#include
#include
int mknod(const char *path,mode_t mod,dev_t dev);
int mkfifo(const char *path,mode_t mode);
函式mknod引數中path為建立的命名管道的全路徑名:mod為建立的命名管道的模式,指明其訪問許可權;dev為裝置值,該值取決於檔案建立的種類,它只在建立裝置檔案時才會勇到。這兩個函式調勇成功都返回0,失敗都返回-1。下面使勇mknod函式建立了乙個命名管
道:umask(0);
if (mknod("/tmp/fifo",s_ififo | 0666) == -1)
函式mkfifo前兩個引數的含義和mknod相同。下面是使用mkfifo的示例**:
umask(0);
if (mkfifo("/tmp/fifo",s_ififo|0666) == -1)
「s_ififo|0666」指明建立乙個命名管道且訪問許可權為0666,即建立者、與建立者同組的用
戶、其他使用者對該命名管道的訪問許可權都是可讀可寫(
這裡要注意
umask
對生成的
管道檔案許可權的影響)。
命名管道建立後就可以使用了,命名管道和管道的使用方法基本是相同的。只是使用命名管道時,必須先呼叫open()將其開啟。因為命名管道是乙個存在於硬碟上的檔案,而管道是存在於記憶體中的特殊檔案。
需要注意的是,呼叫open()開啟命名管道的程序可能會被阻塞。但如果同時用讀寫方式(o_rdwr)開啟,則一定不會導致阻塞;如果以唯讀方式(o_rdonly)開啟,則呼叫open()函式的程序將會被阻塞直到有寫方開啟管道;同樣以寫方式(o_wronly)開啟
也會阻塞直到有讀方式開啟管道。
實現:client.c
1 #include2 #include3 #include4 #include5 #include6 #include7 #include8 #include9
10 int main()
11 18 char buf[1024];
19 while(1)
20
server.c
1 #include2 #include3 #include4 #include5 #include6 #include7 #include8
9 int main()
10 16 int fd=open("./myfifo",o_rdonly);
17 if(fd<0)
18
22 char buf[1024];
23 while(1)
24 {
25 memset(buf,'\0',sizeof(buf));
26 ssize_t _s=read(fd,buf,sizeof(buf)-1);
27 if(_s>0)
28 {
29 printf("client: %s\n",buf);
執行結果:
Linux 程序間通訊詳解二
訊息佇列 訊息佇列提供了本機上從乙個程序向另外乙個程序傳送一塊資料的方法 每個資料塊都被認為有乙個型別,接收者程序接收的資料塊可以有不同的型別值 訊息佇列也有管道一樣的不足,就是每個訊息的最大長度是由上限的 msgmax 每個訊息佇列的總的位元組數是有上限的 msgmnb 系統上訊息佇列的總數也有乙...
程序間通訊(二)
傳遞更多的資料 到目前為止我們所用的機制只是簡單的在乙個fread或是fwrite中傳送或是接收全部的資料。有時我們也許以更小的尺寸傳送資料,或是也許我們並不知道輸出的大小。為了避免宣告乙個大的緩衝區,我們可以使用多個fread或是fwrite呼叫並分別處理這些資料。下面是乙個程式,popen3.c...
程序間通訊《二》
sysv 共享記憶體。sysv 共享記憶體和posix 共享記憶體類似。主要用到的api有 shmget,shmat,shmctl,shmdt,下面將這些api一一道來。intshmget key t key,size t size,intoflag 返回 成功返回共享記憶體的描述字,出錯時 1 在...