popen和pclose

我們經常會有這樣的操作,創建一個連接到另一個程序的管道,然後讀其輸出端或向其輸入端發送數據,爲此標準I/O庫提供了兩個函數popen和pclose來簡化這些步驟。
這兩個函數實現的操作是:創建一個管道,fork一個子進程,關閉未使用的管道端,執行一個shell命令(popen);然後等待命令終止(pclose)。

#include <stdio.h>
/**
 * 函數popen先執行fork,然後調用cmdstring,並且返回一個標準I/O文件指針。
 * @param  cmdstring 用於執行的命令字符串
 * @param  type      'r':文件指針連接到cmdstring的標準輸出;
 *                              'w':則文件指針連接到cmdstring的標準輸入
 * @return          返回值:若成功,返回文件指針;若出錯,返回NULL
 */
FILE *popen(const char *cmdstring, const char *type);

/**
  * pclose函數關閉標準I/O流,等待命令終止,然後返回shell的終止狀態。
  * @param  fp popen返回的文件指針
  * @return    返回值:若成功,返回cmdstring的終止狀態;若出錯,然後-1
  */
int pclose(FILE *fp);

如果type是”r”,則文件指針連接到cmdstring的標準輸出。
這裏寫圖片描述
如果type是”w”,則文件指針連接到cmdstring的標準輸入。
這裏寫圖片描述
一個例子:

#include <stdio.h>
#include <stdlib.h>
#include <sys/wait.h>

#define MAXLINE 4096            /* max line length */
#define PAGER   "${PAGER:-more}" /* environment variable, or default */

int main(int argc, char *argv[])
{
    char    line[MAXLINE];
    FILE    *fpin, *fpout;

    if (argc != 2)
        printf("usage: a.out <pathname>");
    if ((fpin = fopen(argv[1], "r")) == NULL)
        printf("can't open %s", argv[1]);

    if ((fpout = popen(PAGER, "w")) == NULL)
        printf("popen error");

    /* copy argv[1] to pager */
    while (fgets(line, MAXLINE, fpin) != NULL) {
        if (fputs(line, fpout) == EOF)
            printf("fputs error to pipe");
    }
    if (ferror(fpin))
        printf("fgets error");
    if (pclose(fpout) == -1)
        printf("pclose error");

    exit(0);
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章