使用pipe操作太繁琐,系统库提供了一个管道的封装函数,使popen()创建的管道必须使用pclose()关闭,与标准文件输入\输出中的fopen\fclose非常相似。
#include<stdio.h>
FILE * popen(const char * cmdstring,const char *type);
返回值:成功返回文件指针,出错返回NULL。
int pclose(FILE * fp)
返回值:cmdstring的终止状态,出错返回-1。
“r”
子进程标准输出重定向到管道写端,数据写入管道,父进程从管道读取结果,将结果放置到FILE*类型的文件指针所指向的结构体缓存中。
“w”
子进程从管道中读取数据作为命令执行的输入,标准输入重定向到管道的读端。父进程将结构体缓存中的数据写入管道。
/*************************************************************************
> File Name: popen_example.c
> Author: CC
> Mail: 6828620@163.com
> Created Time: 2018年10月09日 星期二 22时43分06秒
************************************************************************/
#include<stdio.h>
#include<stdlib.h>
#include<memory.h>
int main(void)
{
FILE* fp;
fp = popen("cat /etc/passwd","r");
char buf[512];
memset(buf,0,sizeof(buf));
while(fgets(buf,sizeof(buf),fp) != NULL){
printf("%s",buf);
}
pclose(fp);
printf("*********************************\n");
fp = popen("wc -l", "w");
fprintf(fp,"1\n2\n3\n");
pclose(fp);
exit(0);
}