進(jìn)程間通信(2)-無(wú)名管道

無(wú)名管道通信框架

要保證是對(duì)同一個(gè)管道進(jìn)行操作瞄桨。

1孩饼、管道

管道文件是一個(gè)特殊的文件说榆,就是一個(gè)緩沖伶椿,是由隊(duì)列來(lái)實(shí)現(xiàn)的研乒,出隊(duì)端讀阱缓,入隊(duì)端寫(xiě)古掏。

在文件IO中創(chuàng)建一個(gè)文件或打開(kāi)一個(gè)文件是由open函數(shù)來(lái)實(shí)現(xiàn)的帜平,但它不能創(chuàng)建管道文件吟温,只能用pipe函數(shù)來(lái)創(chuàng)建管道序仙。

函數(shù)形式:
int pipe(int fd[2])
功能:創(chuàng)建管道,為系統(tǒng)調(diào)用:unistd.h(系統(tǒng)調(diào)用函數(shù)所在的.h文件)
參數(shù):就是得到的文件描述符鲁豪∨说浚可見(jiàn)有兩個(gè)文件描述符:fd[0]和fd[1],管道有一個(gè)讀端fd[0]用來(lái)讀和一個(gè)寫(xiě)端fd[1]用來(lái)寫(xiě)爬橡,這個(gè)規(guī)定不能變治唤。
返回值:成功是0,出錯(cuò)是-1糙申;

例1:pipe函數(shù)的使用

#include "unistd.h"
#include "stdio.h"
#include "stdlib.h"

int main()
{
    int fd[2];
    int ret;
    ret = pipe(fd);
    if(ret < 0)
    {
        printf("create pipe fail\n");
        return -1;
    }
    printf("create pipe success fd[0]=%d, fd[1]=%d\n",fd[0],fd[1]);
    return 0;
}

解釋?zhuān)簅pen函數(shù)如果創(chuàng)建成功肝劲,返回的文件描述符從3開(kāi)始。
因?yàn)橐粋€(gè)進(jìn)程打開(kāi)時(shí)郭宝,內(nèi)核會(huì)自動(dòng)打開(kāi)3個(gè)文件描述符:0辞槐、1、2粘室。

例2:pipe函數(shù)的使用

#include "unistd.h"
#include "stdio.h"
#include "stdlib.h"

int main()
{
    int fd[2];
    int ret;
    char writebuf[] = "hello linux";
    char readbuf[128] = {0};
    ret = pipe(fd);
    if(ret < 0)
    {
        printf("create pipe fail\n");
        return -1;
    }
    printf("create pipe success fd[0]=%d, fd[1]=%d\n",fd[0],fd[1]);

    write(fd[1], writebuf, sizeof(writebuf));
    // start read from pipe
    read(fd[0], readbuf, 128);
    printf("readbuf = %s\n", readbuf);

    close(fd[0]);
    close(fd[1]);
    return 0;
}
確實(shí)讀到了

2榄檬、管道特點(diǎn)

  • 管道是創(chuàng)建在內(nèi)存中的;進(jìn)程結(jié)束衔统,空間釋放鹿榜,管道就不存在了。
  • 管道中的東西锦爵,讀完了就刪除了(和隊(duì)列是一樣的)
  • 如果管道中沒(méi)有東西可讀舱殿,則會(huì)讀阻塞。

例3:驗(yàn)證讀阻塞

#include "unistd.h"
#include "stdio.h"
#include "stdlib.h"
#include "string.h"

int main()
{
    int fd[2];
    int ret;
    char writebuf[] = "hello linux";
    char readbuf[128] = {0};
    ret = pipe(fd);
    if(ret < 0)
    {
        printf("create pipe fail\n");
        return -1;
    }
    printf("create pipe success fd[0]=%d, fd[1]=%d\n",fd[0],fd[1]);

    write(fd[1], writebuf, sizeof(writebuf));
    // start read from pipe
    read(fd[0], readbuf, 128);
    printf("readbuf = %s\n", readbuf);

    // second read from pipe
    memset(readbuf, 0, 128);

    read(fd[0], readbuf, 128);
    printf("second read complete\n");

    close(fd[0]);
    close(fd[1]);
    return 0;
}
1.第一次讀完就刪除了险掀,因此第2次沒(méi)東西讀了沪袭;2.沒(méi)東西可讀了,就阻塞了

例4:驗(yàn)證會(huì)寫(xiě)阻塞

#include "unistd.h"
#include "stdio.h"
#include "stdlib.h"
#include "string.h"

int main()
{
    int fd[2];
    int ret;
    int i = 0;
    char writebuf[] = "hello linux";
    char readbuf[128] = {0};
    ret = pipe(fd);
    if(ret < 0)
    {
        printf("create pipe fail\n");
        return -1;
    }
    printf("create pipe success fd[0]=%d, fd[1]=%d\n",fd[0],fd[1]);

    while(i < 5500)
    {
        write(fd[1], writebuf, sizeof(writebuf));
        i++;
    }

    printf("write pipe end\n");  // 如果存在寫(xiě)阻塞樟氢,這句話不會(huì)被打印出來(lái)

    close(fd[0]);
    close(fd[1]);
    return 0;
}
iwrite pipe end沒(méi)有被打印出來(lái)冈绊,說(shuō)明寫(xiě)阻塞了

例5:驗(yàn)證寫(xiě)阻塞:可以計(jì)算出內(nèi)核開(kāi)辟的管道有多大侠鳄。

#include "unistd.h"
#include "stdio.h"
#include "stdlib.h"
#include "string.h"

int main()
{
    int fd[2];
    int ret;
    int i = 0;
    char writebuf[] = "hello linux";
    char readbuf[128] = {0};
    ret = pipe(fd);
    if(ret < 0)
    {
        printf("create pipe fail\n");
        return -1;
    }
    printf("create pipe success fd[0]=%d, fd[1]=%d\n",fd[0],fd[1]);

    while(i < 5400)
    {
        write(fd[1], writebuf, sizeof(writebuf));
        i++;
    }

    printf("write pipe end\n");  // 如果存在寫(xiě)阻塞,這句話不會(huì)被打印出來(lái)

    close(fd[0]);
    close(fd[1]);
    return 0;
}
打印出來(lái)了死宣,說(shuō)明管道在5400到5500之間

范圍:5456-5457之間伟恶。即:5456是非阻塞,5457是阻塞毅该。

例6:通過(guò)管道實(shí)現(xiàn)進(jìn)程間通信

#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>

int main()
{
    pid_t pid;
    int fd[2]; // 文件描述符數(shù)組
    int ret; // 返回值
    int process_inter = 0;

    // pipe必須放在子進(jìn)程之前(pipe函數(shù)必須在fork函數(shù)之前)博秫。這樣才是同一個(gè)管道。
    ret = pipe(fd);
    if(fd<0)
    {
        printf("create pipe fail\n");
        return -1;
    }
    printf("create pipe success\n");

    pid = fork();

    if(pid == 0) // child process
    {
        int i = 0;
        read(fd[0], &process_inter, 1); // child process read
        while(process_inter == 0); // 如果讀到是0眶掌,一直循環(huán)
        for(i = 0; i < 5; i++)  // 如果讀到是1挡育,就往下運(yùn)行
        {
            printf("this is child process %d\n", i);
            usleep(100);
        }
    }
    if(pid>0)  // parent process 
    {
        int i = 0;
        for(i=0;i<5;i++)
        {
            printf("this is parent process i=%d\n", i);
            usleep(100);
        }
        process_inter = 1;
        sleep(5);  // 父進(jìn)程運(yùn)行完后,休眠5s
        write(fd[1], &process_inter, 1); // parent process write
    }
    while(1);
    return 0;
}
父進(jìn)程先運(yùn)行畏线,之后休眠5s,子進(jìn)程再運(yùn)行

3良价、無(wú)名管道的缺點(diǎn)

只能實(shí)現(xiàn)父子關(guān)系或者有親緣關(guān)系的進(jìn)程間的通信寝殴。

因?yàn)榉歉缸雨P(guān)系的進(jìn)程,在pipe函數(shù)創(chuàng)建無(wú)名管道時(shí)明垢,都會(huì)各自創(chuàng)建一個(gè)管道蚣常,它們只能與各自創(chuàng)建的無(wú)名管道進(jìn)行通信,這樣它們倆就無(wú)法通過(guò)無(wú)名管道進(jìn)行通信痊银。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末抵蚊,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子溯革,更是在濱河造成了極大的恐慌贞绳,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,686評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件致稀,死亡現(xiàn)場(chǎng)離奇詭異冈闭,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)抖单,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,668評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門(mén)萎攒,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人矛绘,你說(shuō)我怎么就攤上這事耍休。” “怎么了货矮?”我有些...
    開(kāi)封第一講書(shū)人閱讀 158,160評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵羊精,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我囚玫,道長(zhǎng)园匹,這世上最難降的妖魔是什么雳刺? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,736評(píng)論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮裸违,結(jié)果婚禮上掖桦,老公的妹妹穿的比我還像新娘。我一直安慰自己供汛,他們只是感情好枪汪,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,847評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著怔昨,像睡著了一般雀久。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上趁舀,一...
    開(kāi)封第一講書(shū)人閱讀 50,043評(píng)論 1 291
  • 那天赖捌,我揣著相機(jī)與錄音,去河邊找鬼矮烹。 笑死越庇,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的奉狈。 我是一名探鬼主播卤唉,決...
    沈念sama閱讀 39,129評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼仁期!你這毒婦竟也來(lái)了桑驱?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 37,872評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤跛蛋,失蹤者是張志新(化名)和其女友劉穎熬的,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體赊级,經(jīng)...
    沈念sama閱讀 44,318評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡悦析,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,645評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了此衅。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片强戴。...
    茶點(diǎn)故事閱讀 38,777評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖挡鞍,靈堂內(nèi)的尸體忽然破棺而出骑歹,到底是詐尸還是另有隱情,我是刑警寧澤墨微,帶...
    沈念sama閱讀 34,470評(píng)論 4 333
  • 正文 年R本政府宣布道媚,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏最域。R本人自食惡果不足惜谴分,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,126評(píng)論 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望镀脂。 院中可真熱鬧牺蹄,春花似錦、人聲如沸薄翅。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,861評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)翘魄。三九已至鼎天,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間暑竟,已是汗流浹背斋射。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,095評(píng)論 1 267
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留但荤,地道東北人罗岖。 一個(gè)月前我還...
    沈念sama閱讀 46,589評(píng)論 2 362
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像纱兑,于是被迫代替她去往敵國(guó)和親呀闻。 傳聞我的和親對(duì)象是個(gè)殘疾皇子化借,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,687評(píng)論 2 351

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

  • 前言 管道是UNIX環(huán)境中歷史最悠久的進(jìn)程間通信方式潜慎,也是最簡(jiǎn)單的進(jìn)程間通信方式,一般用來(lái)作為IPC的入門(mén)蓖康,最合適...
    GeekerLou閱讀 1,146評(píng)論 0 6
  • 一.管道機(jī)制(pipe) 1.Linux的fork操作 在計(jì)算機(jī)領(lǐng)域中铐炫,尤其是Unix及類(lèi)Unix系統(tǒng)操作系統(tǒng)中,...
    Geeks_Liu閱讀 3,686評(píng)論 1 9
  • Android跨進(jìn)程通信IPC整體內(nèi)容如下 1蒜焊、Android跨進(jìn)程通信IPC之1——Linux基礎(chǔ)2倒信、Andro...
    隔壁老李頭閱讀 15,531評(píng)論 19 113
  • 文/北嶺的燕子 文字是我的眼鳖悠、耳、口优妙、鼻乘综,更是我的心。 不知是不是受道家思想的熏陶套硼,在我這個(gè)年紀(jì)卻已有些不急不爭(zhēng)卡辰。...
    北嶺的燕子閱讀 577評(píng)論 12 13
  • 這一天,早上匆匆出門(mén)吃了白水煮泡面…上午幫著班主任們搬書(shū),中午飯?zhí)貏e不好吃九妈,紫菜湯還可以反砌,中午在辦公桌上睡了一段時(shí)...
    蘋(píng)果樹(shù)上的芒果閱讀 369評(píng)論 0 0