久久婷婷香蕉热狠狠综合,精品无码国产自产拍在线观看蜜,寡妇房东在做爰3,中文字幕日本人妻久久久免费,国产成人精品三上悠亚久久


標準流管道

分享(xiang)到:
           

    本文關鍵字: linux 管道通信,linux 進程通信方式 ,標準流管道

    1.標準流管道函數說明

    與Linux的文(wen)(wen)件(jian)操作(zuo)(zuo)中(zhong)有基于文(wen)(wen)件(jian)流的標(biao)準I/O操作(zuo)(zuo)一(yi)(yi)樣,管道(dao)的操作(zuo)(zuo)也支(zhi)持基于文(wen)(wen)件(jian)流的模(mo)式(shi)。這(zhe)種(zhong)基于文(wen)(wen)件(jian)流的管道(dao)主要是(shi)用(yong)來(lai)創(chuang)建(jian)一(yi)(yi)個(ge)連接到(dao)(dao)另(ling)(ling)一(yi)(yi)個(ge)進(jin)程(cheng)(cheng)的管道(dao),這(zhe)里的“另(ling)(ling)一(yi)(yi)個(ge)進(jin)程(cheng)(cheng)”也就是(shi)一(yi)(yi)個(ge)可以進(jin)行(xing)一(yi)(yi)定操作(zuo)(zuo)的可執(zhi)(zhi)行(xing)文(wen)(wen)件(jian),例如,用(yong)戶執(zhi)(zhi)行(xing)“ls -l”或者(zhe)自己編寫的程(cheng)(cheng)序(xu)“./pipe”等(deng)。由于這(zhe)類操作(zuo)(zuo)很常用(yong),因此標(biao)準流管道(dao)就將一(yi)(yi)系列的創(chuang)建(jian)過程(cheng)(cheng)合并到(dao)(dao)一(yi)(yi)個(ge)函數popen()中(zhong)完(wan)成。它所(suo)完(wan)成的工作(zuo)(zuo)有以下幾(ji)步:

    ● 創建一個管道。
    ● fork()一個子進程。
    ● 在父子進程中關閉不需要的文件描述符。
    ● 執行exec函數族調用。
    ● 執行函數中(zhong)所指定的命(ming)令。

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

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

    2.函數格式

    popen()和(he)(he)pclose()函數語法要點(dian)如(ru)表(biao)(biao)1和(he)(he)表(biao)(biao)2所示。

表1 popen()函(han)數語法要點

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

表2 pclose()函數語法要點

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

    3.使用實例

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

    /* 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) /* 調用popen()函數執行相應的命令 */
        {
            printf("Popen error\n");
            exit(1);
        }
        while ((fgets(buf, BUFSIZE, fp)) != NULL)
        {
            printf("%s",buf);
        }
        pclose(fp);
        exit(0);
    }

    下面是該程序(xu)在目(mu)標板上(shang)的(de)執行(xing)結(jie)果。

    $ ./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   &nbsp;         root       2020   R     ps –ef

    本文選自華清遠見嵌入式培訓教材《從實踐中學嵌入式Linux應用程序開發》

   熱點(dian)鏈接:

   1、無名管道系統調用
   2、Linux下進程間通信方式-管道
   3、Linux下進程間通信
   4、實驗:編寫守護進程
   5、實驗:編寫多進程程序

更多新聞>>