1、description
函数原型:
#include <stdio.h>
FILE *popen(const char *cmdstring, const char *type);
返回值:若成功则返回文件指针,若出错则返回NULL
int pclose(FILE *fp);
返回值:cmdstring的终止状态,若出错则返回-1
popen函数原理:创建一个管道,调用fork产生一个子进程,关闭管道的不使用端,执行一个shell运行命令cmdstring,然后等待命令终止。
返回函数文件指针fd,如果type是’r’,则fd连接到命令输出,相当于fd是管道的读端fd[0],命令输出另一端是写端fd[1];
如果type是’w’,则fd连接到命令输入,相当于fd是管道的写端fd[1],命令输出另一端是读端fd[0]。
2、code
执行一个shell命令,将得到的结果保存下来。
#include <stdlib.h>
#include <unistd.h>
#include <iostream>
#include <stdio.h>
#include <set>
#include <string.h>
using namespace std;
int main()
{
FILE* fp = NULL;
char cmd[512];
char line[10];
sprintf(cmd, "echo 1;echo 2;echo 3;echo 4;echo 5");
fp = popen(cmd, "r");
set<int> poolid;
if( fp == NULL){
cout<<"popen failed"<<endl;
return 1;
}
while(fgets(line, sizeof(line), fp)){
poolid.insert(atoi(line));
}
pclose(fp);
cout<<"pool id size:"<<poolid.size()<<endl;
for(set<int>::iterator it=poolid.begin();it!=poolid.end();it++){
cout<<*it<<endl;
}
return 0;
}
输出
pool id size:5
1
2
3
4
5