程序間通訊的方式:
ipc(interprocess communication):程序間通訊1.1管道的概念:管道是核心緩衝區,可以叫做偽檔案(不占用磁碟檔案)
(1)管道的特點:
①管道有讀端和寫端。資料從寫端流入,讀端流出。讀端和寫端是兩個檔案描述符。
②含有管道的程序結束後,管道被釋放
③管道預設是阻塞的。資料必須讀端流入,寫端流出
(1)內部實現方式:佇列(環形佇列),先進先出。
(2)緩衝區大小:預設為4k,大小會根據實際情況做適當的調整
(1)資料只能讀取一次,不能重複使用,資料傳輸方向是單向的(半雙工)
單工:遙控器(2)匿名管道:只適用於由血緣關係的程序間通訊半雙工:資料傳輸的方向是單向的,對講機
雙工:資料時雙向流動的,**
函式:int pipe(int pipefd[2]);
#include
#include
#include
#include
#include
#include
intmain()
printf
("pipe[0] = %d\n"
, fd[0]
);printf
("pipe[1] = %d\n"
, fd[1]
);close
(fd[0]
);close
(fd[1]
);return0;
}
單個程序也能使用管道完成通訊,平時沒有這個必要例:父程序將資料寫入管道,子程序從管道中讀取資料
/* 實現 ps aux | gerp "bash" */
#include
#include
#include
#include
#include
#include
intmain()
pid_t pid =
fork()
;if(pid ==-1
)//父程序 ps aux
//子程序 grep "bush"
if(pid >0)
else
if(pid ==0)
close
(fd[0]
);close
(fd[1]
);return0;
}
注意事項:程式中的重定向:父程序寫資料 – 關閉寫端
子程序讀資料 – 關閉讀端
因為管道是阻塞的
父程序中 – dup2(fd[1], stdout_fileno); //stdout_fileno跟隨 fd[1]
子程序中 – dup2(fd[0], stdin_fileno); //stdin_fileno跟隨 fd[0]
1.讀操作
(1)管道中有資料:
(2)管道中無資料:
2.寫操作
(1)讀端全部關閉
(2)讀端沒有被全部關閉
(3)設定管道為非阻塞
1.命令檢視:ulimit -a
2.函式:
#include
long
fpathconf
(int fd,
int name)
;long
pathconf
(const
char
*path,
int name)
;
1.使用場景:沒有血緣關係的程序間通訊
2.建立方式:
#include
#include
intmkfifo
(const
char
*pathname, mode_t mode)
;
引數:
①pathname:fifo檔名
②mode:fifo檔案的開啟方式
例:該程序以唯讀的方式開啟 myfifo
int fd =
open
("myfifo"
, o_rdonly)
;
現有兩個程序a,b屬於不同的程序組。
a程序進行讀操作,b程序進行寫操作
a.c —> read
int fd =
open
("myfifo"
, o_rdonly)
;read
(fd, buf,
sizeof
(buf)
;close
(fd)
;
b.c —>read
int fd1 =
open
("myfifo"
, o_wronly)
;write
(fd1,
"hello,world",11
);close
(fd1)
;
程序間通訊 管道
include int pipe int fd 2 返回值 若成功,返回0,若出錯,返回 1經由引數fd返回兩個檔案描述符 fd 0 為讀而開啟,fd 1 為寫而開啟。fd 1 的輸出是fd 0 的輸入。else if pid 0 子程序 else else if pid 0 父程序 printf ...
程序間通訊 管道
原文 程序間通訊 管道 管道簡介 常說的管道都是匿名半雙工管道,匿名半雙工管道在系統中是沒有實名的,並不可以在檔案系統中以任何方式看到該管道。它只是程序的一種資源,會隨著程序的結束而被系統清除。管道通訊是在unix系統中應用比較頻繁的一種方式,例如使用grep查詢 ls grep ipc 顧名思義,...
程序間通訊 管道
程序間通訊,又稱為ipc,包含以下型別 半雙工管道fifo 全雙工管道 訊息佇列 訊號 訊號量共享記憶體 套接字socket streams。一,管道是unix系統ipc的最古老形式,他具有兩種侷限性 1 資料只能在乙個方向上流動 2 只能在具有公共祖先的程序之間使用。乙個管道由乙個程序建立,然後該...