linux IPC 匿名管道

轉自:http://blog.csdn.net/Xiejingfa/article/details/50819660

進程間通信麻捻,英文又稱作IPC(InterProcess Communication)就是在不同的進程之間交換信息丛楚。我們知道,進程的用戶是相空間互獨立的周循,不能相互訪問拭卿,所以為了使得進程間可以相互通信擒抛,操作系統(tǒng)需要提供一種介質使通信雙方都可以訪問牧抵。類似這樣的介質有很多灭袁,比如磁盤上的文件,我們只要協(xié)調(diào)好進程訪問文件的順序洞豁,一個進程先“寫”盐固,一個進程后“讀”,這樣族跛,兩者就可以相互交換信息了闰挡。又比如我們經(jīng)常使用的數(shù)據(jù)庫锐墙,也可以作為信息交換的媒介礁哄。但是這些通信手段效率都太低了,需要在系統(tǒng)級別提供高效的進程間通信手段溪北。今天我們就來介紹一種最古老的進程間通信方式 – 管道桐绒。

1、什么是管道之拨?

如果你熟悉Linux系統(tǒng)茉继,一定不會對管道感到陌生。在Linux系統(tǒng)中蚀乔,我們經(jīng)常通過符號“|”來使用管道烁竭,用以連接兩個或多個命令。那管道是什么吉挣?實際上派撕,管道是進程與進程間的數(shù)據(jù)流通道,它使得數(shù)據(jù)可以以一種“流”的形式在進程間流動睬魂。管道也是Unix/Linux系統(tǒng)中一種最常見的進程間通信方式终吼,它在兩個通信進程之間實現(xiàn)一個數(shù)據(jù)流的通道從而進行信息傳遞。管道通信具有以下特點:

1氯哮,管道是沒有名字的际跪,因此有稱為匿名管道。它在系統(tǒng)中是沒有實名的,不能在文件系統(tǒng)中看到管道姆打。

2良姆,在大多數(shù)系統(tǒng)中,管道通信是半雙工的穴肘,也就是說數(shù)據(jù)只能在一個方向上流動歇盼。

3,管道中傳送的是無格式的字節(jié)流评抚。

4豹缀,管道的緩沖區(qū)是有限的,它的大小在include/linux/limits.h中由PIPE_BUF定義慨代。

5邢笙,管道只能用于具有親緣關系的進程間進行通信,如父子進程或者兄弟進程侍匙。

2氮惯、管道的創(chuàng)建

Linux下管道是通過pipe函數(shù)創(chuàng)建的,函數(shù)原型如下:

#include <unistd.h>

intpipe(intpipefd[2]);// 若成功則返回0想暗,出錯則返回-1

其中參數(shù)pipefd[2]是一個長度為2的文件描述符數(shù)組妇汗,pipefd[0]是讀端,pipefd[1]是寫端说莫。

管道的關閉則使用close函數(shù)杨箭。

#include <unistd.h>

intclose(intfd);

管道關閉時,需要將pipefd[0]和pipefd[1]都關閉掉储狭。

我們先用一段代碼演示一下管道的創(chuàng)建:

pipe單進程實例

??? 在上面的例子中互婿,我們使用pipe()函數(shù)創(chuàng)建了一個管道。到這里你可能會感到奇怪:不是說管道是進程間通信的方式嗎辽狈?在單個進程中創(chuàng)建管道慈参,然后從一段寫入從另一端讀出有什么意義?下面我們重點講解一下管道如何實現(xiàn)進程間通信刮萌。

3驮配、管道的讀寫

??? 正如你所想的,在單個進程中的創(chuàng)建管道幾乎沒有意義着茸。前面我們說過管道只能用于父子進程或者兄弟進程間進行通信壮锻,通常我們先創(chuàng)建pipe,接著調(diào)用fork函數(shù)元扔,從而創(chuàng)建從父子進程或者兄弟進程間的ipc通道躯保。

??? 為什么這樣就能創(chuàng)建進程通信的管道呢?其中的功臣就是fork函數(shù)澎语。fork函數(shù)創(chuàng)建出來的子進程是父進程的一個拷貝途事,子進程從父進程中得到數(shù)據(jù)段和堆棧段的拷貝验懊。這樣,父子都擁有事先創(chuàng)建管道的文件描述符尸变,都可以往管道中讀寫信息义图。一般用于文件的IO函數(shù)如read、write等都可以用于管道的讀寫召烂。

管道數(shù)據(jù)流向

???? 經(jīng)過fork函數(shù)調(diào)用之后碱工,父子進程間存在兩種數(shù)據(jù)流向的管道:一個是從父進程到子進程的數(shù)據(jù)通道,另一個是從子進程到父進程的數(shù)據(jù)通道奏夫。管道只支持半雙工通信怕篷,所以我們必須關閉其中一個數(shù)據(jù)通道!酗昼!

??? 比如:如果你想建立一個父進程到子進程的數(shù)據(jù)通道廊谓,就要在父進程中關閉讀端,在子進程中關閉寫端麻削。

??? 通常蒸痹,利用pipe和fork的組合,我們可以構造父子進程或者兄弟進程間任意方向的的數(shù)據(jù)通道呛哟。

父子進程通過pipe通信

上面的例子演示了利用管道在父進程到子進程的通信叠荠,而管道在兄弟進程間通信則需要在父進程調(diào)用兩次fork函數(shù)創(chuàng)建兩個子進程,在兩個兄弟子進程中維護通信管道扫责。

4榛鼎、管道讀寫的規(guī)則

管道寫入的規(guī)則:程序向管道寫入數(shù)據(jù)時,如果緩沖區(qū)有空閑空間公给,寫進程立即向管道寫入數(shù)據(jù)借帘。如果緩沖區(qū)已滿蜘渣,那么寫操作就一直阻塞到讀進程讀走數(shù)據(jù)為止淌铐。

管道讀取的規(guī)則:如果請求的字節(jié)數(shù)大于PIPE_SIZE,則返回管道中現(xiàn)有的字節(jié)數(shù)蔫缸。如果請求的字節(jié)數(shù)不大于PIPE_SIZE腿准,則返回請求的字節(jié)數(shù)或現(xiàn)有數(shù)據(jù)的字節(jié)數(shù)(管道中的數(shù)據(jù)量小于請求的數(shù)據(jù)量)。

如果讀寫一端已經(jīng)被關閉的管道是呢拾碌?

如果讀一個寫端已經(jīng)被關閉的管道時吐葱,當所有的數(shù)據(jù)都被讀取后,read返回0校翔,表示文件結束弟跑。

如果寫一個讀端已經(jīng)被關閉的管道,則產(chǎn)生SIGPIPE信號防症。如果忽略該信號或從處理程序中返回后孟辑,write函數(shù)返回-1哎甲,并且errno被設置為EPIPE。

?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末饲嗽,一起剝皮案震驚了整個濱河市炭玫,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌貌虾,老刑警劉巖吞加,帶你破解...
    沈念sama閱讀 216,692評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異尽狠,居然都是意外死亡衔憨,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,482評論 3 392
  • 文/潘曉璐 我一進店門袄膏,熙熙樓的掌柜王于貴愁眉苦臉地迎上來巫财,“玉大人,你說我怎么就攤上這事哩陕∑较睿” “怎么了?”我有些...
    開封第一講書人閱讀 162,995評論 0 353
  • 文/不壞的土叔 我叫張陵悍及,是天一觀的道長闽瓢。 經(jīng)常有香客問我,道長心赶,這世上最難降的妖魔是什么扣讼? 我笑而不...
    開封第一講書人閱讀 58,223評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮缨叫,結果婚禮上椭符,老公的妹妹穿的比我還像新娘。我一直安慰自己耻姥,他們只是感情好销钝,可當我...
    茶點故事閱讀 67,245評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著琐簇,像睡著了一般蒸健。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上婉商,一...
    開封第一講書人閱讀 51,208評論 1 299
  • 那天似忧,我揣著相機與錄音,去河邊找鬼丈秩。 笑死盯捌,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的蘑秽。 我是一名探鬼主播饺著,決...
    沈念sama閱讀 40,091評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼滤祖,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了瓶籽?” 一聲冷哼從身側響起匠童,我...
    開封第一講書人閱讀 38,929評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎塑顺,沒想到半個月后汤求,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,346評論 1 311
  • 正文 獨居荒郊野嶺守林人離奇死亡严拒,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,570評論 2 333
  • 正文 我和宋清朗相戀三年扬绪,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片裤唠。...
    茶點故事閱讀 39,739評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡挤牛,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出种蘸,到底是詐尸還是另有隱情墓赴,我是刑警寧澤,帶...
    沈念sama閱讀 35,437評論 5 344
  • 正文 年R本政府宣布航瞭,位于F島的核電站诫硕,受9級特大地震影響,放射性物質發(fā)生泄漏刊侯。R本人自食惡果不足惜章办,卻給世界環(huán)境...
    茶點故事閱讀 41,037評論 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望滨彻。 院中可真熱鬧藕届,春花似錦、人聲如沸亭饵。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,677評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽冬骚。三九已至椅贱,卻和暖如春懂算,著一層夾襖步出監(jiān)牢的瞬間只冻,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,833評論 1 269
  • 我被黑心中介騙來泰國打工计技, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留喜德,地道東北人。 一個月前我還...
    沈念sama閱讀 47,760評論 2 369
  • 正文 我出身青樓垮媒,卻偏偏與公主長得像舍悯,于是被迫代替她去往敵國和親航棱。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,647評論 2 354

推薦閱讀更多精彩內(nèi)容