实例:
#include <stdio.h>
#include <string.h>
#include <iostream>
int main(){
char outBuffer[1024]; // 保存运行后输出的结果
char *cmdStr = "ls ."; // 准备运行的命令
FILE * pipeLine = popen(cmdStr,"r"); // 建立流管道
if(!pipeLine){ // 检测流管道
perror("Fail to popen\n");
return 1;
}
while(fgets(outBuffer, 1024, pipeLine) != NULL){ // 获取输出
printf("输出: %s",outBuffer); // 打印输出
}
pclose(pipeLine);
return 0;
}
但是有时候我们利用上面命令却获取不到输出,这是因为有的程序是在stderr上进行输出的,比如ffmpeg,因此可以改成类似下面的代码:
popen创建的管道,默认读取的是标准输出stdout,但很多程序(如ffmpeg相关的)输出到stderr上,为了能方便地读取这些输出,需要在执行命令时,对输出做重定向( 2>&1)。
int RunCmd(std::string strCmd, PFunCommandOutput funOut) {
FILE *fp = NULL;
char data[1024] = {0};
LOG(INFO) << "To popen: " << strCmd;
strCmd += " 2>&1";
fp = popen(strCmd.c_str(), "r");
if (NULL == fp) {
LOG(ERROR) << "popen " << strCmd << " fail: " << errno;
return -1;
}
while (fgets(data, sizeof(data), fp) != NULL) {
if (NULL != funOut) {
funOut(data);
}
}
return pclose(fp)
执行命令的输出信息,通过回调函数返回给调用者;当命令执行完成后,函数会返回命令的执行结果。