三、有名管道相關操作
總結通訊要解決的實際問題,就是多個程序之間如何實現資料的收發
分為兩種:有名管道,無名管道(屬於半雙工)
全雙工:通訊雙方在任何時刻都能互相收發資訊,收發資訊可以同時進行不受任何影響
半雙工:通訊雙方在任意時刻都只能是一方發生,一方接收,不能同時兩邊都收發
父子程序採用無名管道通訊–>雙向 通訊 思路:採用兩個無名管道實現
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 程序控制 有些程序希望完全控制某些程序的執行,...