程序間通訊之管道講解

2021-10-22 04:03:32 字數 2459 閱讀 7907

三、有名管道相關操作

總結通訊要解決的實際問題,就是多個程序之間如何實現資料的收發

分為兩種:有名管道,無名管道(屬於半雙工)

全雙工:通訊雙方在任何時刻都能互相收發資訊,收發資訊可以同時進行不受任何影響

半雙工:通訊雙方在任意時刻都只能是一方發生,一方接收,不能同時兩邊都收發

父子程序採用無名管道通訊–>雙向 通訊 思路:採用兩個無名管道實現

fd[2] --> 存放的是無名管道讀寫端的檔案描述符

fd[0] --> 讀端的檔案描述符

fd[1] --> 寫端的檔案描述符

**如下(示例):

int state;

int fd[2]

;int otherfd[2]

;char buf[

100]

;char otherbuf[

100]

;int ret;

//建立乙個無名管道

ret =

pipe

(fd);if

(ret ==-1

)//再建立乙個無名管道

ret =

pipe

(otherfd);if

(ret ==-1

)//建立乙個子程序

pid_t id =

fork()

;if(id>0)

printf

("my son say : %s\n"

,buf)

;printf

("please input information to son : \n");

scanf

("%s"

,otherbuf)

;//把資訊寫入到第二個無名管道中

write

(otherfd[1]

,otherbuf,

strlen

(otherbuf));

}}//兒子

else

//從第二個無名管道中讀取內容

read

(otherfd[0]

,otherbuf,

100)

;printf

("my father say : %s\n"

,otherbuf);}

//結束子程序

exit(0

);}close

(fd[0]

);close

(fd[1]

);close

(otherfd[0]

);close

(otherfd[1]

);//**子程序

wait

(&state)

;printf

("recovery son :%d\n"

,wexitstatus

(state)

);

1)如果管道中沒有資料可讀,read會阻塞當前程序

2)無名管道不會生成管道檔案

3)無名管道有固定的讀寫端

4)無名管道只能用於具有血緣關係多個程序之間(父子程序、兄弟程序)

mkfifo函式

第乙個引數:生成的有名管道的路徑

第二個引數:許可權 0777

有名管道用於兩個沒有任何關係的程序間通訊

有名管道在建立之前必須判斷一下管道檔案是否存在

方法一:使用errno去判斷

方法二:使用access函式判斷

擴充: int access(const char *path,int amode);

path–>你要判斷的檔案的路徑

amode–> r_ok 判斷檔案是否可讀

w_ok 判斷檔案是否可寫

x_ok 判斷檔案是否可執行

f_ok 判斷檔案是否存在

**如下(示例):

int ret;

int fd;

char buf[

100]

;//建立有名管道

ret =

mkfifo

("/home/gec/myfirst"

,0777);

if(ret==-1

)//錯誤的原因不是檔案存在

else

}//開啟你剛才新建的那個管道檔案

fd =

open

("/home/gec/myfirst"

,o_rdwr);if

(fd ==-1

)//給p2傳送資訊

while(1

)

1)有名管道會生成對應的管道檔案(用於等一會程序間通訊)

2)有名管道不能再同乙個路徑下重複建立,並且只能在純粹的linux環境中建立,不能在共享資料夾中新建

3)有名管道可以用於任意兩個程序間通訊(可以是父子程序,也可以是沒有任何關係的兩個程序)

4)有名管道沒有固定的讀寫端,只要開啟成功,直接讀寫操作

程序間通訊 之 管道

一 無名管道 特點 具有親緣關係的程序間通訊,但不僅僅指父子程序之間哦。1 無名管道的建立 int pipe int pipefd 引數 pipefd 陣列的首位址 返回值 成功返回0,失敗返回 1 注意 無名管道存在核心空間,建立成功會給使用者空間兩個檔案描述符,fd 0 讀管道 fd 1 寫管道...

程序間通訊之管道

我們將乙個程序到另乙個程序的資料流稱為管道,它是程序間通訊最古老的方式。管道分為兩種 匿名管道與命名管道。匿名管道 顧名思義,所謂的匿名管道自然就是沒有名字的管道,這種管道通常用於有親緣關係的程序間的通訊。匿名管道通常由pipe函式來建立,當乙個程序建立了乙個匿名管道後,它們的模型就是這樣的 可以看...

程序間通訊之管道

既然要介紹程序間通訊,首先來看看什麼是程序間通訊 2.程序間通訊的目的 1 資料傳輸 乙個程序需要將它的資料傳送給另乙個人程序 2 資源共享 多個程序共享同樣的資源 3 通知事件 乙個程序需要向另乙個或一組程序傳送訊息,通知它 它們 發生了某種事件 4 程序控制 有些程序希望完全控制某些程序的執行,...