Linux--有名管道、命名管道(FIFO)

主要用于沒有血緣關(guān)系的進程間通信具篇。

特點:

1纬霞、半雙工,數(shù)據(jù)在同一時刻只能在一個方向上流動驱显。
2诗芜、寫入FIFO中的數(shù)據(jù)遵循先入先出的規(guī)則。
3埃疫、FIFO所傳送的數(shù)據(jù)是無格式的伏恐,這要求FIFO的讀出方與寫入方必須事先約定好數(shù)據(jù)的格式,如多少字節(jié)算一個消息等栓霜。
4翠桦、FIFO在文件系統(tǒng)中作為一個特殊的文件而存在,但FIFO中的內(nèi)容卻存放在內(nèi)存中胳蛮。
5销凑、管道在內(nèi)存中對應(yīng)一個緩沖區(qū)。不同的系統(tǒng)其大小不一定相同仅炊。
6斗幼、從FIFO讀數(shù)據(jù)是一次性操作,數(shù)據(jù)一旦被讀抚垄,它就從FIFO中被拋棄蜕窿,釋放空間以便寫更多的數(shù)據(jù)。
7呆馁、當使用FIFO的進程退出后桐经,F(xiàn)IFO文件將繼續(xù)保存在文件系統(tǒng)中以便以后使用。
8浙滤、FIFO有名字阴挣,不相關(guān)的進程可以通過打開命名管道進行通信

2、有名管道的API

#include<sys/types.h>
#include<sys/stat.h>
int mkfifo(const char *pathname, mode_t mode);

功能:
? ??創(chuàng)建有名管道FIFO文件的創(chuàng)建
參數(shù):
????pathname:FIFO的路徑名+文件名瓷叫。
????mode:mode_t類型的權(quán)限描述符屯吊。
返回值:
????成功:返回 0
????失敗:如果文件已經(jīng)存在,則會出錯且返回-1

示例代碼

#include<stdio.h>
#include<sys/types.h>?
#include<sys/stat.h>?
#include<fcntl.h>?
#include<string.h>?
#include<unistd.h>?
int main(int argc,char const *argv[])
{?
????????//創(chuàng)建有名管道(保存兩個進程 識別相同目錄)
????????mkfifo("my_fifo", 0666);

#ifdef WRITE
????????int fd = open("my_fifo", O_WRONLY);
#endif
#ifdef READ
? ??????int fd = open("my_fifo", O_RDONLY);
#endif
?????????if (fd < 0)
? ? ? ? {
?????????????????perror("open");
?????????????????return 0;
? ? ? ? ?}
#ifdef WRITE?
? ? ? ? //循環(huán)寫入數(shù)據(jù)
? ? ? ? while(1){
????????????????char buf[128] = "";
????????????????printf("請輸入需要發(fā)送的數(shù)據(jù):");
? ? ? ? ? ? ? ? fgets(buf, sizeof(buf), stdin);
????????????????buf[strlen(buf) ‐ 1] = 0;?
? ? ? ? ? ? ? ?//發(fā)送數(shù)據(jù)?
????????????? write(fd, buf, strlen(buf));?
????????????? //退出循環(huán)
????????????? if (strcmp(buf, "bye") == 0)
????????????????????????break;?
? ? ? ? }
#endif

#ifdef READ?
//循環(huán)的讀取數(shù)據(jù)?
????????? while (1)? ?
? ? ? ? ?{?
? ? ? ? ? ? ? ? //接收數(shù)據(jù)
? ? ? ? ? ? ? ? char buf[128] = "";?
? ? ? ? ? ? ? ? read(fd, buf, sizeof(buf));
? ? ? ? ? ? ? ? printf("收到數(shù)據(jù)位:%s\n", buf);?
? ? ? ? ? ? ? ? //退出循環(huán)?
? ? ? ? ? ? ? ?if (strcmp(buf, "bye") == 0)?
????????????????????? break;?
? ? ? ? ?}?
#endif?
?????close(fd);?
?????return 0;?
}

gcc a.c -o a -D?READ

有名管道讀寫的特點:

道管開打式方塞阻

1摹菠、open以只讀方式打開FIFO時盒卸,要阻塞到某個進程為寫而打開此FIFO
2、open以只寫方式打開FIFO時次氨,要阻塞到某個進程為讀而打開此FIFO蔽介。
3、open以只讀煮寡、只寫方式打開FIFO時會阻塞虹蓄,調(diào)用read函數(shù)從FIFO里讀數(shù)據(jù)時read也會阻塞。
4幸撕、通信過程中若寫進程先退出了薇组,則調(diào)用read函數(shù)從FIFO里讀數(shù)據(jù)時不阻塞;若寫進程又重新運行,則調(diào)用read函數(shù)從FIFO里讀數(shù)據(jù)時又恢復阻塞坐儿。
5律胀、通信過程中,讀進程退出后貌矿,寫進程向命名管道內(nèi)寫數(shù)據(jù)時炭菌,寫進程也會(收到SIGPIPE信號)退出
6逛漫、調(diào)用write函數(shù)向FIFO里寫數(shù)據(jù)黑低,當緩沖區(qū)已滿時write也會阻塞。

以非阻塞方式打開管道:

1酌毡、先以只讀方式打開:如果沒有進程已經(jīng)為寫而打開一個FIFO, 只讀open成功克握,并且open不阻塞
2阔馋、先以只寫方式打開:如果沒有進程已經(jīng)為讀而打開一個FIFO玛荞,只寫open將出錯返回-1
3呕寝、read勋眯、write讀寫命名管道中讀數(shù)據(jù)時不阻塞
4下梢、通信過程中客蹋,讀進程退出后,寫進程向命名管道內(nèi)寫數(shù)據(jù)時孽江,寫進程也會(收到SIGPIPE信號)退出讶坯。
注意: open函數(shù)以可讀可寫方式打開FIFO文件時的特點:
????1、open不阻塞岗屏。
????2辆琅、調(diào)用read函數(shù)從FIFO里讀數(shù)據(jù)時read會阻塞漱办。
????3、調(diào)用write函數(shù)向FIFO里寫數(shù)據(jù)婉烟,當緩沖區(qū)已滿時write也會阻塞

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末娩井,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子似袁,更是在濱河造成了極大的恐慌洞辣,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,589評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件昙衅,死亡現(xiàn)場離奇詭異扬霜,居然都是意外死亡,警方通過查閱死者的電腦和手機而涉,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,615評論 3 396
  • 文/潘曉璐 我一進店門著瓶,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人婴谱,你說我怎么就攤上這事蟹但。” “怎么了谭羔?”我有些...
    開封第一講書人閱讀 165,933評論 0 356
  • 文/不壞的土叔 我叫張陵华糖,是天一觀的道長。 經(jīng)常有香客問我瘟裸,道長客叉,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,976評論 1 295
  • 正文 為了忘掉前任话告,我火速辦了婚禮兼搏,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘沙郭。我一直安慰自己佛呻,他們只是感情好,可當我...
    茶點故事閱讀 67,999評論 6 393
  • 文/花漫 我一把揭開白布病线。 她就那樣靜靜地躺著吓著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪送挑。 梳的紋絲不亂的頭發(fā)上绑莺,一...
    開封第一講書人閱讀 51,775評論 1 307
  • 那天,我揣著相機與錄音惕耕,去河邊找鬼纺裁。 笑死,一個胖子當著我的面吹牛司澎,可吹牛的內(nèi)容都是我干的欺缘。 我是一名探鬼主播栋豫,決...
    沈念sama閱讀 40,474評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼谚殊!你這毒婦竟也來了笼才?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,359評論 0 276
  • 序言:老撾萬榮一對情侶失蹤络凿,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后昂羡,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體絮记,經(jīng)...
    沈念sama閱讀 45,854評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,007評論 3 338
  • 正文 我和宋清朗相戀三年虐先,在試婚紗的時候發(fā)現(xiàn)自己被綠了怨愤。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,146評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡蛹批,死狀恐怖撰洗,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情腐芍,我是刑警寧澤差导,帶...
    沈念sama閱讀 35,826評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站猪勇,受9級特大地震影響设褐,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜泣刹,卻給世界環(huán)境...
    茶點故事閱讀 41,484評論 3 331
  • 文/蒙蒙 一助析、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧椅您,春花似錦外冀、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,029評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至开伏,卻和暖如春膀跌,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背固灵。 一陣腳步聲響...
    開封第一講書人閱讀 33,153評論 1 272
  • 我被黑心中介騙來泰國打工捅伤, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人巫玻。 一個月前我還...
    沈念sama閱讀 48,420評論 3 373
  • 正文 我出身青樓丛忆,卻偏偏與公主長得像祠汇,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子熄诡,可洞房花燭夜當晚...
    茶點故事閱讀 45,107評論 2 356

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