新聞中心

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

        進程間通信之:管道

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

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

        8.2.4標準流

        1.標準流函數說明

        的文件操作中有基于文件流的標準I/O操作一樣,的操作也支持基于文件流的模式。這種基于文件流的管道主要是用來創建一個連接到另一個的管道,這里的“另一個”也就是一個可以進行一定操作的可執行文件,例如,用戶執行“ls-l”或者自己編寫的程序“./pipe”等。由于這一類操作很常用,因此標準流管道就將一系列的創建過程合并到一個函數popen()中完成。它所完成的工作有以下幾步。

        n 創建一個管道。

        n fork()一個子

        n 在父子進程中關閉不需要的文件描述符。

        n 執行exec函數族調用。

        n 執行函數中所指定的命令。

        這個函數的使用可以大大減少代碼的編寫量,但同時也有一些不利之處,例如,它不如前面管道創建的函數那樣靈活多樣,并且用popen()創建的管道必須使用標準I/O函數進行操作,但不能使用前面的read()、write()一類不帶緩沖的I/O函數。

        與之相對應,關閉用popen()創建的流管道必須使用函數pclose()來關閉該管道流。該函數關閉標準I/O流,并等待命令執行結束。

        2.函數格式

        popen()和pclose()函數格式如表8.2和表8.3所示。

        表8.2 popen()函數語法要點

        所需頭文件

        #includestdio.h>

        函數原型

        FILE*popen(constchar*command,constchar*type)

        函數傳入值

        command:指向的是一個以null結束符結尾的字符串,這個字符串包含一個shell命令,并被送到/bin/sh以-c參數執行,即由shell來執行

        type:

        “r”:文件指針連接到command的標準輸出,即該命令的結果產生輸出
        “w”:文件指針連接到command的標準輸入,即該命令的結果產生輸入

        函數返回值

        成功:文件流指針

        出錯:-1

        表8.3 pclose()函數語法要點

        所需頭文件

        #includestdio.h>

        函數原型

        intpclose(FILE*stream)

        函數傳入值

        stream:要關閉的文件流

        函數返回值

        成功:返回由popen()所執行的進程的退出碼

        出錯:-1

        3.函數使用實例

        在該實例中,使用popen()來執行“ps-ef”命令。可以看出,popen()函數的使用能夠使程序變得短小精悍。

        /*standard_pipe.c*/

        #includestdio.h>

        #includeunistd.h>

        #includestdlib.h>

        #includefcntl.h>

        #defineBUFSIZE1024

        intmain()

        {

        FILE*fp;

        char*cmd=ps-ef;

        charbuf[BUFSIZE];

        /*調用popen()函數執行相應的命令*/

        if((fp=popen(cmd,r))==NULL)

        {

        printf(Popenerrorn);

        exit(1);

        }

        while((fgets(buf,BUFSIZE,fp))!=NULL)

        {

        printf(%s,buf);

        }

        pclose(fp);

        exit(0);

        }

        下面是該程序在目標板上的執行結果。

        $./standard_pipe

        PIDTTYUidSizeStateCommand

        1root1832Sinit

        2root0S[keventd]

        3root0S[ksoftirqd_CPU0]

        ……

        74root1284S./standard_pipe

        75root1836Ssh-cps-ef

        76root2020Rps–ef

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

        linux相關文章:linux教程


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


        通信相關文章:通信原理




        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 宜丰县| 铜山县| 绥阳县| 方山县| 大荔县| 栖霞市| 阳山县| 巴南区| 玉龙| 遵化市| 车险| 互助| 浑源县| 五河县| 方山县| 白朗县| 泾川县| 大埔县| 蒙城县| 万荣县| 山丹县| 清涧县| 海盐县| 镇原县| 鄂托克前旗| 子洲县| 南康市| 彭州市| 循化| 湖南省| 大化| 泰顺县| 周口市| 清涧县| 昔阳县| 大埔区| 红桥区| 前郭尔| 攀枝花市| 麻阳| 施秉县|