當今比較常用的有:
管道(使用簡單)
訊號(開銷最小)
共享對映區(無血緣關係)
本地套接字(最穩定)
管道又分為:無名管道和有名管道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程序 此時控制程序希望能夠攔截另乙個程序的所有操作,並能夠及...