我們經常會有這樣的操作,創建一個連接到另一個程序的管道,然後讀其輸出端或向其輸入端發送數據,爲此標準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);
}