linux 之有名管道 (atom)

2021-10-10 04:16:47 字數 3121 閱讀 5682

無名管道的缺點:只能在父子程序或者其它具有親緣關係的程序間進行資料傳輸。

有名管道:可以在任意程序之間傳輸。

標頭檔案

#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...