Linux 程序通訊(管道)筆記

2021-10-23 20:40:15 字數 2929 閱讀 4371

當今比較常用的有:

管道(使用簡單)

訊號(開銷最小)

共享對映區(無血緣關係)

本地套接字(最穩定)

管道又分為:無名管道和有名管道fifo

無名管道:只能用於有親屬關係的程序間

有名管道:可以用在有親屬關係的程序間也可用在無親屬關係的程序間

管道是基於檔案描述符的通訊方式,當乙個管道建立時,它會建立兩個檔案描述符 fds[0]和 fds[1],其中 fds[0]固定用於讀管道,而 fd[1]固定用於寫管道,這樣就構成了乙個半雙工的通道。

管道關閉時只需將這兩個檔案描述符關閉即可,可使用普通的 close 函式逐個關閉各個檔案描述符。

管道其本質是乙個偽檔案(實為核心緩衝區)

管道的原理:管道實為核心使用環形佇列的機制,借助核心緩衝區(4k)實現。

管道的侷限性:

資料自己讀不能自己寫

資料一旦被讀走,便不在管道中存在,不可反覆讀取

由於管道採用半雙工通訊方式,因此,資料只能在乙個方向上流動

只能在有親屬關係的程序間使用管道

7種檔案型別:

前三個是占用記憶體空間的;後四個是不占用記憶體空間的,並且都是偽檔案

/* 建立一子程序 */if(

(pid =

fork()

)==0)

/* 關閉子程序讀描述符 */

close

(pipe_fd[0]

);exit(0

);}else

if(pid >0)

/*關閉父程序寫描述符*/

close

(pipe_fd[1]

);/*收集子程序退出資訊*/

waitpid

(pid,

null,0

);exit(0

);}}

結果:

有名管道fifo,它可以使互不相關的兩個程序實現彼此通訊。

對於讀程序

對於寫程序

讀端:

/* fifo_read.c */

#include

#include

#include

#include

#include

#include

#include

#include

#define myfifo "/tmp/myfifo"

#define max_buffer_size pipe_buf

/*定義在於limits.h中*/

intmain()

}/* 以唯讀阻塞方式開啟有名管道 */

fd =

open

(myfifo, o_rdonly);if

(fd ==-1

)while(1

)}close

(fd)

;exit(0);}

寫端:

/* fifo_write.c */

#include

#include

#include

#include

#include

#include

#include

#define myfifo "/tmp/myfifo"

/* 有名管道檔名*/

#define max_buffer_size pipe_buf

/*定義在於limits.h中*/

intmain

(int argc,

char

* ar**)

/*引數為即將寫入的字串*/

sscanf

(ar**[1]

,"%s"

, buff)

;/* 以只寫阻塞方式開啟fifo管道 */

fd =

open

(myfifo, o_wronly);if

(fd ==-1

)/*向管道中寫入字串*/if(

(nwrite =

write

(fd, buff, max_buffer_size)

)>0)

close

(fd)

;exit(0);}

結果:

要先執行讀端,因為管道是在讀端簡歷的;如果先執行寫端的話,會報錯:管道檔案開啟失敗

寫端:

讀端:

linux程序通訊 管道

管道分為有名管道和無名管道。無名管道 無名管道是半雙工的,就是對於乙個管道來講只能讀或者寫。就像高速公路一樣一條路只能單向行駛。建立無名管道的函式 所需要標頭檔案 include 函式原型 int pipe int fd 2 函式的返回值 失敗返回 1,成功返回0 乙個簡單的無名管道的例子 main...

linux 程序通訊 管道通訊

程序通訊 1 pipe 函式的作用 建立無名管道 函式的原型 int pipe int fds 2 函式的引數 新建的兩個描述符fds陣列返回 fds 0 表示管道的讀取端 fds 1 表示管道的寫入端 返回值 成功 0 出錯 1 標頭檔案 include 2 mkfifo 函式的作用 建立有名管道...

程序通訊 管道通訊

程序間通訊 目的 資料傳輸 乙個程序需要將它的資料傳送給另乙個程序 資源共享 多個程序之間共享同樣的資源 通知事件 乙個程序需要向另乙個或一組程序傳送訊息,通知它們發生了某種事件 程序控制 有些程序希望完全控制另乙個程序的執行 如debug程序 此時控制程序希望能夠攔截另乙個程序的所有操作,並能夠及...