系列文章:
linux ipc程序間通訊(一):管道
linux ipc程序間通訊(二):共享記憶體
linux ipc程序間通訊(三):訊號量
linux ipc程序間通訊(四):訊息佇列
linux程序間通訊(ipc)的乙個重要方法就是管道,在學習管道之前,要理解兩個概念
不論是無名管道還是有名管道,都屬於半雙工管道,理解這一點非常重要。
void
test1()
;while
(fread
(buf,
sizeof
(char),
sizeof
(buf)
, fp)
) cout << buf;
cout << endl;
pclose
(fp)
;//寫
char buf2=
; file *fp2 =
popen
("wc -w"
,"w");
fwrite
(buf2,
sizeof
(char),
sizeof
(buf2)
, fp2)
;pclose
(fp2)
;}
注意:
無名管道中的read
函式會進行阻塞。
因為pipe()
函式只能建立出半雙工管道,所以fds[0]只能讀,fds[1]只能寫
案例:建立乙個無名管道 與 父子程序,進行父寫子讀
void
test2()
;pipe
(fds)
;//fds[0] = 3, fds[1] = 4;if(
fork()
==0);
read
(fds[0]
, buf,
sizeof
(buf));
cout <<
"child process reading:"
<< buf << endl;
close
(fds[0]
);exit(0
);}close
(fds[0]
);char buf[
100]
="helloworld"
;write
(fds[1]
, buf,
strlen
(buf));
cout <<
"father process is writing"
<< endl;
close
(fds[1]
);wait
(null);
}
命名管道比起無名管道,即便不是親屬程序也能夠進行程序間通訊
另外,命名管道可以作為檔案存在。
需要使用mkfifo
命令建立命名管道
命名管道:讀寫操作案例
分別建立好讀端
與寫端
, 並設定退出機制
注意:如果沒有設定退出機制,那麼read端 將會預設一直在接收 0 個字元,讀端將會一直列印空字串
寫端 (write.cpp)
:
int
main()
;while(1
)return0;
}
讀端(read.cpp)
:
int
main()
;int ret;
while(1
) cout <<
"ret = "
<< ret << endl;
cout <<
"buf = "
<< buf << endl;
}return0;
}
通過以上程式,可以實現一端寫,一段讀的案例。 程序間通訊(一) 管道
一,用管道進行父子程序通訊 include include define maxline 120 define msginfo hurry up n int main void pid t pid if pipe fd 0 if pid fork 0 if pid 0 father write st...
Linux程序間通訊(一)管道
乙個程序在管道的尾部寫入資料,另乙個程序從管道的頭部讀出資料。管道包括無名管道和有名管道兩種,前者只能用於父程序和子程序間的通訊,後者可用於執行於同一系統中 的任意兩個程序間的通訊。管道通訊 特點 管道通訊是單向的,有固定的讀端和寫端。資料被程序從管道讀出後,在管道中該資料就不存在了。當程序去讀取空...
IPC程序間通訊 一 管道
ipc inter process communication 管道 訊號 共享記憶體 訊息佇列 資訊量 套接字 管道分為 無名 匿名 管道和有名 命名 管道 區別 缺點 侷限於父子程序間的通訊且會發生阻塞 fcntl 步驟建立 pipe 函式原型 int pipe int filedes 2 引數...