Linux程序間通訊 命名管道

2021-08-22 00:01:18 字數 2174 閱讀 8286

我們知道,匿名管道只能用於父子關係的程序之間。那麼沒有這種關係的程序之間該如何進行資料傳遞呢?

1.什麼是命名管道

匿名管道是在快取中開闢的輸出和輸入檔案流的空間,只能用於父子關係的程序之間。因為父子程序的輸入和輸出檔案描述符是一致的。

命名管道是一種實際存在的fifo檔案,稱作「管道檔案」,用於不同程序之間,命名管道程序間開啟同乙個fifo檔案,進行資料傳遞。

我們可以像普通檔案一樣操作fifo檔案。不同程序,引用同乙個fifo檔案,進行資料傳遞。

2.建立命名管道

mkfifo函式:建立乙個命名管道

//filename:指定fifo檔案的名稱

//mode:指定檔案的讀寫許可權

int mkfifo(const char *filename,mode_t mode);

3.訪問命名管道

開啟fifo檔案有四種方式:

open(const char *filename,o_rdonly);

open(const char *filename,o_rdonly|o_nonblock);

open(const char *filename,o_wronly);

open(const char *filename,o_wronly|o_nonblock);

需要注意的是,不能以o_rdwr模式開啟fifo檔案,因為這樣乙個程序寫入的資料會被該程序讀取,fifo一般只用做單向的資料傳遞。

open函式的第二個引數,表示是讀管道,還是寫管道。o_nonblock表示fifo管道的讀寫是非阻塞的,預設的話,是阻塞的。那麼何為阻塞呢?

乙個程序寫模式開啟管道的時候,必須有另乙個程序以讀模式開啟;或讀模式的時候,必須有另乙個程序寫寫模式開啟,否則該程序open函式阻塞,直到滿足以上關係。

非阻塞,意味著open函式會立即返回,若沒有其他程序以唯讀方式開啟,open返回-1,並且fifo也不會被開啟。

4.fifo管道使用示例

下例有兩個程式,fifowrite.c和fiforead.c分別寫管道和讀管道。fifowrite.c中將乙個文字檔案data.txt,寫到管道。fiforead.c中從管道讀取資料,並寫到dataformfifo.txt檔案中。程式使用了預設的阻塞模式。示例**如下:

fifowrite.c

#include#include#include#include#includeint main()

}printf("process %d opening fifo o_wronly\n",getpid());

pipe_fd = open(fifo_name,open_mode);

data_fd = open("data.txt",o_rdonly);

printf("process %d result %d\n",getpid(),pipe_fd);

if(pipe_fd!=-1)

bytes_read = read(data_fd,buffer,pipe_buf);

buffer[bytes_read]='\0';

}close(pipe_fd);

close(data_fd);

}else

printf("process %d finished.\n",getpid());

exit(exit_success);

}

fiforead.c

#include#include#include#include#includeint main()

while(res>0);

close(pipe_fd);

close(data_fd);

}else

printf("process %d finished,%d bytes read\n",getpid(),bytes_read);

exit(exit_success);

}

5.多個程序同時寫管道

當多個程序同時寫管道時,讀管道取得的資料是雜亂的。此時,我們可以控制每個程序,當要寫入的資料超過某個大小時,才寫管道,另外要以阻塞的方式開啟fifo。確保寫操作的原子性。

Linux程序間通訊 命名管道

ipc 命名管道 一 原理 管道的乙個不足之處是沒有名字,因此,只能用於具有親緣關係的程序間通訊,在命名管道 named pip 或fifo 提出後,該限制得到了克服。fifo 不同於管道之處 在於它提供乙個路徑名與之關聯,以fifo的檔案形式儲存於檔案系統中 命名管道是乙個裝置檔案,因此,即使程序...

linux程序間通訊(命名管道)

在處理程序間通訊的問題時,匿名管道只能在有親緣關係的程序中進行通訊。如何做到在任意兩個程序之間通訊,這就要用到命名管道。命名管道也被稱為fifo檔案,它是一種特殊型別的檔案,在檔案系統中以檔案的形式存在,它的行為和匿名管道類似。可以使用mkfifo函式來建立乙個命名管道。int mkfifo con...

linux程序間通訊 命名管道

命名管道也被稱為fifo檔案,它是一種特殊型別的檔案,它在檔案系統中以檔名的形式存在,但是它的行為卻和之前所講的沒有名字的管道 匿名管道 類似。有名管道是有名有形的,為了使用這種管道linux中設立了乙個專門的特殊檔案系統 管道檔案,它存在於檔案系統中,任何程序可以在任何時候通過有名管道的路徑和檔案...