新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 進程間通信之:管道

        進程間通信之:管道

        作者: 時間:2013-09-13 來源:網絡 收藏

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

        4.使用實例

        在本例中,首先創建,之后父使用fork()函數創建子,之后通過關閉父的讀描述符和子進程的寫描述符,建立起它們之間的通信。

        /*pipe.c*/

        #includeunistd.h>

        #includesys/types.h>

        #includeerrno.h>

        #includestdio.h>

        #includestdlib.h>

        #defineMAX_DATA_LEN256

        #defineDELAY_TIME1

        intmain()

        {

        pid_tpid;

        intpipe_fd[2];

        charbuf[MAX_DATA_LEN];

        constchardata[]=PipeTestProgram;

        intreal_read,real_write;

        memset((void*)buf,0,sizeof(buf));

        /*創建管道*/

        if(pipe(pipe_fd)0)

        {

        printf(pipecreateerrorn);

        exit(1);

        }

        /*創建一子進程*/

        if((pid=fork())==0)

        {

        /*子進程關閉寫描述符,并通過使子進程暫停1s等待父進程已關閉相應的讀描述符*/

        close(pipe_fd[1]);

        sleep(DELAY_TIME*3);

        /*子進程讀取管道內容*/

        if((real_read=read(pipe_fd[0],buf,MAX_DATA_LEN))>0)

        {

        printf(%dbytesreadfromthepipeis'%s'n,real_read,buf);

        }

        /*關閉子進程讀描述符*/

        close(pipe_fd[0]);

        exit(0);

        }

        elseif(pid>0)

        {

        /*父進程關閉讀描述符,并通過使父進程暫停1s等待子進程已關閉相應的寫描述符*/

        close(pipe_fd[0]);

        sleep(DELAY_TIME);

        if((real_write=write(pipe_fd[1],data,strlen(data)))!=-1)

        {

        printf(Parentwrote%dbytes:'%s'n,real_write,data);

        }

        /*關閉父進程寫描述符*/

        close(pipe_fd[1]);

        /*收集子進程退出信息*/

        waitpid(pid,NULL,0);

        exit(0);

        }

        }

        將該程序交叉編譯,下載到開發板上的運行結果如下所示:

        $./pipe

        Parentwrote17bytes:'PipeTestProgram'

        17bytesreadfromthepipeis'PipeTestProgram'

        5.管道讀寫注意點

        n 只有在管道的讀端存在時,向管道寫入數據才有意義。否則,向管道寫入數據的進程將收到內核傳來的SIGPIPE信號(通常為Brokenpipe錯誤)。

        n 向管道寫入數據時,將不保證寫入的原子性,管道緩沖區一有空閑區域,寫進程就會試圖向管道寫入數據。如果讀進程不讀取管道緩沖區中的數據,那么寫操作將會一直阻塞。

        n 父子進程在運行時,它們的先后次序并不能保證,因此,在這里為了保證父子進程已經關閉了相應的文件描述符,可在兩個進程中調用sleep()函數,當然這種調用不是很好的解決方法,在后面學到進程之間的同步與互斥機制之后,請讀者自行修改本小節的實例程序。

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

        linux相關文章:linux教程


        數字通信相關文章:數字通信原理


        通信相關文章:通信原理




        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 闽清县| 泽普县| 沙湾县| 若尔盖县| 湾仔区| 政和县| 余庆县| 长垣县| 五河县| 虞城县| 大田县| 搜索| 伊川县| 石楼县| 中方县| 昌平区| 齐河县| 富平县| 新昌县| 横山县| 阳高县| 古田县| 蒙山县| 双江| 任丘市| 定远县| 莒南县| 绥宁县| 岳池县| 察雅县| 富蕴县| 舟曲县| 平凉市| 三台县| 屯昌县| 绵阳市| 哈尔滨市| 故城县| 洱源县| 舞钢市| 邯郸县|