新聞中心

        進(jìn)程間通信之:管道

        作者: 時(shí)間:2013-09-13 來(lái)源:網(wǎng)絡(luò) 收藏

        本文引用地址:http://www.104case.com/article/257127.htm

        3.使用實(shí)例

        下面的實(shí)例包含了兩個(gè)程序,一個(gè)用于讀,另一個(gè)用于寫(xiě)。其中在讀的程序里創(chuàng)建管道,并且作為main()函數(shù)里的參數(shù)由用戶輸入要寫(xiě)入的內(nèi)容。讀管道的程序會(huì)讀出用戶寫(xiě)入到管道的內(nèi)容,這兩個(gè)程序采用的是阻塞式讀寫(xiě)管道模式。

        以下是寫(xiě)管道的程序:

        /*fifo_write.c*/

        #includesys/types.h>

        #includesys/stat.h>

        #includeerrno.h>

        #includefcntl.h>

        #includestdio.h>

        #includestdlib.h>

        #includelimits.h>

        #defineMYFIFO/tmp/myfifo/*有名管道文件名*/

        #defineMAX_BUFFER_SIZEPIPE_BUF/*定義在于limits.h中*/

        intmain(intargc,char*argv[])/*參數(shù)為即將寫(xiě)入的字符串*/

        {

        intfd;

        charbuff[MAX_BUFFER_SIZE];

        intnwrite;

        if(argc=1)

        {

        printf(Usage:./fifo_writestringn);

        exit(1);

        }

        sscanf(argv[1],%s,buff);

        /*以只寫(xiě)阻塞方式打開(kāi)FIFO管道*/

        fd=open(MYFIFO,O_WRONLY);

        if(fd==-1)

        {

        printf(Openfifofileerrorn);

        exit(1);

        }

        /*向管道中寫(xiě)入字符串*/

        if((nwrite=write(fd,buff,MAX_BUFFER_SIZE))>0)

        {

        printf(Write'%s'toFIFOn,buff);

        }

        close(fd);

        exit(0);

        }

        以下是讀管道程序:

        /*fifo_read.c*/

        (頭文件和宏定義同fifo_write.c)

        intmain()

        {

        charbuff[MAX_BUFFER_SIZE];

        intfd;

        intnread;

        /*判斷有名管道是否已存在,若尚未創(chuàng)建,則以相應(yīng)的權(quán)限創(chuàng)建*/

        if(access(MYFIFO,F_OK)==-1)

        {

        if((mkfifo(MYFIFO,0666)0)(errno!=EEXIST))

        {

        printf(Cannotcreatefifofilen);

        exit(1);

        }

        }

        /*以只讀阻塞方式打開(kāi)有名管道*/

        fd=open(MYFIFO,O_RDONLY);

        if(fd==-1)

        {

        printf(Openfifofileerrorn);

        exit(1);

        }

        while(1)

        {

        memset(buff,0,sizeof(buff));

        if((nread=read(fd,buff,MAX_BUFFER_SIZE))>0)

        {

        printf(Read'%s'fromFIFOn,buff);

        }

        }

        close(fd);

        exit(0);

        }

        為了能夠較好地觀察運(yùn)行結(jié)果,需要把這兩個(gè)程序分別在兩個(gè)終端里運(yùn)行,在這里首先啟動(dòng)讀管道程序。讀管道在建立管道之后就開(kāi)始循環(huán)地從管道里讀出內(nèi)容,如果沒(méi)有數(shù)據(jù)可讀,則一直阻塞到寫(xiě)管道向管道寫(xiě)入數(shù)據(jù)。在啟動(dòng)了寫(xiě)管道程序后,讀能夠從管道里讀出用戶的輸入內(nèi)容,程序運(yùn)行結(jié)果如下所示。

        終端一:

        $./fifo_read

        Read'FIFO'fromFIFO

        Read'Test'fromFIFO

        Read'Program'fromFIFO

        ……

        終端二:

        $./fifo_writeFIFO

        Write'FIFO'toFIFO

        $./fifo_writeTest

        Write'Test'toFIFO

        $./fifo_writeProgram

        Write'Program'toFIFO

        ……

        linux操作系統(tǒng)文章專題:linux操作系統(tǒng)詳解(linux不再難懂)

        linux相關(guān)文章:linux教程


        數(shù)字通信相關(guān)文章:數(shù)字通信原理


        通信相關(guān)文章:通信原理



        上一頁(yè) 1 2 3 4 5 下一頁(yè)

        評(píng)論


        相關(guān)推薦

        技術(shù)專區(qū)

        關(guān)閉
        主站蜘蛛池模板: 方正县| 清流县| 宁乡县| 京山县| 郧西县| 辛集市| 合肥市| 高阳县| 广饶县| 阳江市| 资阳市| 福建省| 吉安市| 常德市| 炉霍县| 金沙县| 剑河县| 神农架林区| 开远市| 蒙自县| 彭州市| 金湖县| 台中市| 喀什市| 盐津县| 泗洪县| 吴旗县| 虎林市| 雅安市| 淮南市| 隆昌县| 松阳县| 梁平县| 临漳县| 福鼎市| 招远市| 恩平市| 上思县| 曲靖市| 吴旗县| 墨玉县|