程序間通訊 管道

2021-09-25 15:50:25 字數 2926 閱讀 5239

程序間通訊的方式:

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 只能在具有公共祖先的程序之間使用。乙個管道由乙個程序建立,然後該...