管道

管道

image.png
//pipedemo
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<string.h>

//管道有一個(gè)讀取端一個(gè)寫入端

main()
{
    int len,i,apipe[2];
    char buf[BUFSIZ];
    
    if(pipe(apipe) == -1){
        perror("could not make pipe");
        exit(1);
    }
    printf("Got a pipe ! It is fiile descriptors:{%d %d}\n",apipe[0],apipe[1]);
    
    //read from stdin ,write into pipe ,read from pipe,print
    
    while(fgets(buf,BUFSIZ,stdin)){//進(jìn)程從標(biāo)準(zhǔn)輸入讀數(shù)據(jù)嵌言,數(shù)據(jù)存在buf
        len = strlen(buf);
        printf("%d\n",len);
        if(write(apipe[1],buf,len)!=len){//把數(shù)據(jù)寫到管道的寫入端
            perror("writing to pipe");
            break;
        }
        
        for(i = 0;i<len;i++)//清理buf
            buf[i] = 'X';
        len = read(apipe[0],buf,BUFSIZ);//從管道的讀取端讀取數(shù)據(jù)到buf
        
        if(len == -1){
            perror("reading from pipe");
            break;
        }
        if(write(1,buf,len)!=len){//把buf的數(shù)據(jù)輸出到標(biāo)準(zhǔn)輸出
            perror("writing to stdout");
            break;
        }
    }
}

管道有一個(gè)讀取端蝠检,一個(gè)寫入端,當(dāng)一個(gè)進(jìn)程創(chuàng)建了一個(gè)管道之后涎显,該進(jìn)程就有了連向管道兩端的連接坤检。這個(gè)進(jìn)程調(diào)用fork的時(shí)候,他的子進(jìn)程也得到了這兩個(gè)連向管道的連接期吓,父進(jìn)程和子進(jìn)程都可以將數(shù)據(jù)寫到管道的寫數(shù)據(jù)端口早歇,并從讀數(shù)據(jù)端口將數(shù)據(jù)讀出,兩個(gè)進(jìn)程都可以讀寫管道讨勤,但是當(dāng)一個(gè)進(jìn)程讀箭跳,一個(gè)進(jìn)程寫的時(shí)候,管道的使用效率是最高的潭千。

image.png

下面的程序就是pipe與fork結(jié)合起來谱姓,創(chuàng)建一堆通過管道來通信的進(jìn)程。

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<unistd.h>
#define CHILD_MESS "I want a cookie\n"
#define PAR_MESS "testing..\n"
#define oops(m,x)   {perror(m);exit(x);}

main()
{
    int pipefd[2];
    int len;
    char buf[BUFSIZ];
    int read_len;
    
    if(pipe(pipefd) == -1)
        oops("cannot get a pipe",1);
    
    switch(fork()){
        case -1:
            oops("cannot fork",2);
        case 0:
            len = strlen(CHILD_MESS);
            while(1){
                if(write(pipefd[1],CHILD_MESS,len)!=len)
                    oops("write",3);
                sleep(5);
                
            }
            //parent reads from pipe and also writes to pipe
        default:
            len = strlen(PAR_MESS);
            while(1){
                if(write(pipefd[1],PAR_MESS,len)!=len)
                    oops("write",4);
                sleep(1);
                read_len = read(pipefd[0],buf,BUFSIZ);
                if(read_len <=0)
                    break;
                write(1,buf,read_len);
            }
    }
}

總結(jié)

管道在許多方面類似于普通文件刨晴,進(jìn)程使用write將數(shù)據(jù)寫入管道屉来,又通過read把數(shù)據(jù)讀出來。像文件一樣割捅,管道是不帶有任何結(jié)構(gòu)的字節(jié)序列奶躯。另一方面,管道又與文件不同亿驾。

1.主要內(nèi)容 ·輸入/輸出重定向允許完成特定功能的程序通過交換數(shù)據(jù)來進(jìn)行相互協(xié)作嘹黔。 ? Unix 默認(rèn)規(guī)定程序從文件描述符 0 讀取數(shù)據(jù),寫數(shù)據(jù)到文件描述符1,將錯(cuò)誤信息輸 出到文件描述符 2 儡蔓。這三個(gè)文件描述符稱為標(biāo)準(zhǔn)輸入郭蕉、輸出及標(biāo)準(zhǔn)錯(cuò)誤輸出。 ·當(dāng)?shù)卿浀?Unix 系統(tǒng)中喂江,登錄程序設(shè)置文件描述符 0 召锈、 1 、 2 获询。所有的連接涨岁、文件描述符 都會從父進(jìn)程傳遞給子進(jìn)程。它們也會在調(diào)用 exec 時(shí)被傳遞吉嚣。 ·創(chuàng)建文件描述符的系統(tǒng)調(diào)用總是使用最低可用文件描述符號梢薪。 ? 322 ? Unix/Linux 編程實(shí)踐教程 ·重定向標(biāo)準(zhǔn)輸入、輸出以及錯(cuò)誤輸出意味著改變文件描述符 0 尝哆,1- 2 的連接秉撇。有很多 種技術(shù)來重定向標(biāo)準(zhǔn)l/O 。 ·管道是內(nèi)核中的一個(gè)數(shù)據(jù)隊(duì)列秋泄,其每一端連接一個(gè)文件描述符琐馆。程序通過使用 plpe 系統(tǒng)調(diào)用創(chuàng)建管道。 .當(dāng)父進(jìn)程調(diào)用 fork 的時(shí)候恒序,管道的兩端都被復(fù)制到子進(jìn)程中瘦麸。 .只有有共同父進(jìn)程的進(jìn)程之間才可以用管道連接。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末奸焙,一起剝皮案震驚了整個(gè)濱河市瞎暑,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌与帆,老刑警劉巖了赌,帶你破解...
    沈念sama閱讀 216,744評論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異玄糟,居然都是意外死亡勿她,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,505評論 3 392
  • 文/潘曉璐 我一進(jìn)店門阵翎,熙熙樓的掌柜王于貴愁眉苦臉地迎上來逢并,“玉大人,你說我怎么就攤上這事郭卫】沉模” “怎么了?”我有些...
    開封第一講書人閱讀 163,105評論 0 353
  • 文/不壞的土叔 我叫張陵贰军,是天一觀的道長玻蝌。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么俯树? 我笑而不...
    開封第一講書人閱讀 58,242評論 1 292
  • 正文 為了忘掉前任帘腹,我火速辦了婚禮,結(jié)果婚禮上许饿,老公的妹妹穿的比我還像新娘阳欲。我一直安慰自己,他們只是感情好陋率,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,269評論 6 389
  • 文/花漫 我一把揭開白布球化。 她就那樣靜靜地躺著,像睡著了一般翘贮。 火紅的嫁衣襯著肌膚如雪赊窥。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,215評論 1 299
  • 那天狸页,我揣著相機(jī)與錄音,去河邊找鬼扯再。 笑死芍耘,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的熄阻。 我是一名探鬼主播斋竞,決...
    沈念sama閱讀 40,096評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼秃殉!你這毒婦竟也來了坝初?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,939評論 0 274
  • 序言:老撾萬榮一對情侶失蹤钾军,失蹤者是張志新(化名)和其女友劉穎鳄袍,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體吏恭,經(jīng)...
    沈念sama閱讀 45,354評論 1 311
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡拗小,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,573評論 2 333
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了樱哼。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片哀九。...
    茶點(diǎn)故事閱讀 39,745評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖搅幅,靈堂內(nèi)的尸體忽然破棺而出阅束,到底是詐尸還是另有隱情,我是刑警寧澤茄唐,帶...
    沈念sama閱讀 35,448評論 5 344
  • 正文 年R本政府宣布息裸,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏界牡。R本人自食惡果不足惜簿寂,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,048評論 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望宿亡。 院中可真熱鬧常遂,春花似錦、人聲如沸挽荠。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,683評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽圈匆。三九已至漠另,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間跃赚,已是汗流浹背笆搓。 一陣腳步聲響...
    開封第一講書人閱讀 32,838評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留纬傲,地道東北人满败。 一個(gè)月前我還...
    沈念sama閱讀 47,776評論 2 369
  • 正文 我出身青樓,卻偏偏與公主長得像叹括,于是被迫代替她去往敵國和親算墨。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,652評論 2 354

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