国产成人精品三级麻豆,色综合天天综合高清网,亚洲精品夜夜夜,国产成人综合在线女婷五月99播放,色婷婷色综合激情国产日韩


標(biāo)準(zhǔn)流管道

分享到:
           

    本文關(guān)鍵字: linux 管道通信,linux 進(jìn)程通信方式 ,標(biāo)準(zhǔn)流管道

    1.標(biāo)準(zhǔn)流管道函數(shù)說明

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

    ● 創(chuàng)建一個管道。
    ● fork()一個子進(jìn)程。
    ● 在父子進(jìn)程中關(guān)閉不需要的文件描述符。
    ● 執(zhí)行exec函數(shù)族調(diào)用。
    ● 執(zhí)行函數(shù)中所指定的命令。

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

    與之相對應(yīng),關(guān)閉用popen()創(chuàng)建的流管道必須使用函數(shù)pclose()。該函數(shù)關(guān)閉標(biāo)準(zhǔn)I/O流,并等待命令執(zhí)行結(jié)束。

    2.函數(shù)格式

    popen()和pclose()函數(shù)語法要點(diǎn)如表1和表2所示。

表1 popen()函數(shù)語法要點(diǎn)

所需頭文件 #include <stdio.h>
函數(shù)原型 FILE *popen(const char *command, const char *type)
函數(shù)傳入值 command:指向的是一個以null結(jié)束符結(jié)尾的字符串,這個字符串包含一個shell命令,并被送到/bin/sh以-c參數(shù)執(zhí)行,即由shell來執(zhí)行
type “r”:文件指針連接到command的標(biāo)準(zhǔn)輸出,即該命令的結(jié)果產(chǎn)生輸出
“w”:文件指針連接到command的標(biāo)準(zhǔn)輸入,即該命令的結(jié)果產(chǎn)生輸入
函數(shù)返回值 成功:文件流指針
出錯:-1

表2 pclose()函數(shù)語法要點(diǎn)

所需頭文件 #include <stdio.h>
函數(shù)原型 int pclose(FILE *stream)
函數(shù)傳入值 stream:要關(guān)閉的文件流
函數(shù)返回值 成功:返回由popen()所執(zhí)行的進(jìn)程的退出碼
出錯:-1

    3.使用實(shí)例

    在該實(shí)例中,使用popen()來執(zhí)行“ps -ef”命令?梢钥闯觯琾open()函數(shù)的使用能夠使程序變得短小精悍。

    /* standard_pipe.c */
    #include <stdio.h>
    #include <unistd.h>
    #include <stdlib.h>
    #include <fcntl.h>
    #define BUFSIZE 1024

    int main()
    {
        FILE *fp;
        char *cmd = "ps -ef";
        char buf[BUFSIZE];

        if ((fp = popen(cmd, "r")) == NULL) /* 調(diào)用popen()函數(shù)執(zhí)行相應(yīng)的命令 */
        {
            printf("Popen error\n");
            exit(1);
        }
        while ((fgets(buf, BUFSIZE, fp)) != NULL)
        {
            printf("%s",buf);
        }
        pclose(fp);
        exit(0);
    }

    下面是該程序在目標(biāo)板上的執(zhí)行結(jié)果。

    $ ./standard_pipe
    PID TTY        Uid        Size  State  Command
    1              root       1832   S     init
    2              root        0     S     [keventd]
    …
    74             root       1284   S     ./standard_pipe
    75             root       1836   S     sh -c ps -ef
    76             root       2020   R     ps –ef

    本文選自華清遠(yuǎn)見嵌入式培訓(xùn)教材《從實(shí)踐中學(xué)嵌入式Linux應(yīng)用程序開發(fā)》

   熱點(diǎn)鏈接:

   1、無名管道系統(tǒng)調(diào)用
   2、Linux下進(jìn)程間通信方式-管道
   3、Linux下進(jìn)程間通信
   4、實(shí)驗(yàn):編寫守護(hù)進(jìn)程
   5、實(shí)驗(yàn):編寫多進(jìn)程程序

更多新聞>>