popen和pclose
头文件
#include <stdio.h>
函数原型
FILE *popen(const char *command, const char *type);
int pclose(FILE *stream);
int pclose(FILE *stream);
参数
command执向想要执行的指令,type可使用"r"代表读取,"w"代表写入。r时文件指针连接到标准输出,w时文件指针连接到标准输入。
说明
popen函数本身会调用fork()产生子进程,然后从子进程中调用 /bin/sh -c 来执行参数command的指令。根据参数type的值,popen函数会建立管道连到子进程的标准输出设备或标准输入设备,然后返回一个文件指针。之后此进程可以通过此文件指针来读取子进程的输出或写入子进程的标准输入设备中。
pclose函数关闭标准I/O流,等待命令执行结束,然后返回shell的终止状态。
unix环境高级编程的例子
#include <sys/wait.h>
#include <stdio.h>
#include <stdlib.h>
#define PAGER "${PAGER:-more}"
#define MAXLINE 100
int main(int argc, char *argv[])
{
char line[MAXLINE];
FILE *fpin, *fpout;
if(argc != 2)
{
printf("usage: a.out <pathname>\n");
exit(1);
}
if((fpin = fopen(argv[1], "r")) == NULL)
{
printf("can't open %s", argv[1]);
exit(1);
}
if((fpout = popen(PAGER, "w")) == NULL)
{
printf("popen error\n");
exit(1);
}
while(fgets(line, MAXLINE, fpin) != NULL)
{
if(fputs(line, fpout) == EOF)
{
printf("fputs error to pipe\n");
exit(1);
}
}
if(ferror(fpin))
{
printf("fgets error\n");
exit(1);
}
if(pclose(fpout) == -1)
{
printf("pclose error\n");
exit(1);
}
exit(0);
}