無名管道的缺點:只能在父子程序或者其它具有親緣關係的程序間進行資料傳輸。
有名管道:可以在任意程序之間傳輸。
標頭檔案
#include
#include
函式原型
filename就是有名管道的名字,mode表示rwx許可權
intmkfifo
(const
char
*filename,mode_t mode)
;
返回值:
成功:0
失敗:-1
特點:
使用步驟:
測試程式
注意不要自己手動建立管道檔案!!!執行會發生異常!!!
讓 fifo_read 程序 自己建立才能正常工作!!!
fifo_read.c
#include
#include
#include
#include
#include
#include
#include
#include
#include
//有名管道檔名
#define myfifo "./myfifo"
//4096,定義在 limits.h 中
#define max_buffer_size pipe_buf
//引數為即將寫入的字串
intmain
(int argc,
char
**ar**)
}//以唯讀方式開啟有名管道
fd =
open
(myfifo,o_rdonly);if
(-1== fd)
//迴圈讀取有名管道資料
while(1
)}close
(fd)
;exit(0
);}
fifo_write.c
#include
#include
#include
#include
#include
#include
#include
#include
#include
//有名管道檔名
#define myfifo "./myfifo"
//4096,定義在 limits.h 中
#define max_buffer_size pipe_buf
intmain
(int argc,
char
**ar**)
//填充命令列第乙個引數到buf
sscanf
(ar**[1]
,"%s"
,buf)
;//以只寫阻塞方式開啟fifo管道
fd =
open
(myfifo,o_wronly);if
(-1== fd)
//向管道中寫入字串if(
(nwrite =
write
(fd,buf,max_buffer_size)
)>0)
close
(fd)
;exit(0
);}
測試結果
jl@jl-virtual-machine:~/test/11_1$
jl@jl-virtual-machine:~/test/11_1$ ls
fifo_read.c fifo_write.c
jl@jl-virtual-machine:~/test/11_1$ gcc fifo_read.c -o fifo_read
jl@jl-virtual-machine:~/test/11_1$
jl@jl-virtual-machine:~/test/11_1$
jl@jl-virtual-machine:~/test/11_1$ gcc fifo_write.c -o fifo_write
jl@jl-virtual-machine:~/test/11_1$
jl@jl-virtual-machine:~/test/11_1$ ls
fifo_read fifo_read.c fifo_write fifo_write.c
jl@jl-virtual-machine:~/test/11_1$
jl@jl-virtual-machine:~/test/11_1$ ./fifo_read
jl@jl-virtual-machine:~/test/11_1$
jl@jl-virtual-machine:~/test/11_1$
jl@jl-virtual-machine:~/test/11_1$ ./fifo_write 666
write '666' to fifo.
jl@jl-virtual-machine:~/test/11_1$ ./fifo_write 777
write '777' to fifo.
jl@jl-virtual-machine:~/test/11_1$
此時終端1中:
jl@jl-virtual-machine:~/test/11_1$
jl@jl-virtual-machine:~/test/11_1$
jl@jl-virtual-machine:~/test/11_1$ ./fifo_read
read '666' from fifo.
read '777' from fifo.
任意程序之間資料傳輸。
寫是原子操作型別。
設定寫的size是4096,每次寫都會阻塞在write,直到接收程序 read 4096。
而且同時執行兩個接收方程序,寫一次只能有乙個程序接收到傳送方內容。
Linux程序通訊之有名管道
1 定義參照前文無名管道 2 特點 1 區別於無名,管道有名管道可以使互不相關的兩個程序通訊 在建立管道時,通過路徑 檔名來進行識別 2 建立有名管道後,程序可以將其作為檔案來進行讀寫 3 先進先出fifo。4 fifo在寫入的資料的位元組數小於或者等於pipe buf時,能夠保證write操作是原...
程序通訊之有名管道
程序通訊之有名管道 一 前言 我們前面部落格講過,父子程序之間,對於檔案操作的檔案操作符是共享的,而對於程序的全域性資料,堆區資料,棧區資料是不共享的,那麼程序之間到底是怎麼進行資訊的傳遞的呢,具體的實現,以及傳遞的過程是怎麼完成的呢,前面我們講過訊號在程序之間的使用,那也是一種程序之間資訊的傳遞。...
Linux 多程序 IPC之有名管道FIFO
命名管道也被稱為fifo檔案,是一種特殊的檔案。由於linux所有的事物都可以被視為檔案,所以對命名管道的使用也就變得與檔案操作非常統一。1 建立命名管道 用如下兩個函式中的其中乙個,可以建立命名管道。include include int mkfifo const char filename,mo...