linux下有些命令可以让我们省不少事情,在开发的过程中,可以利用这些命令,从而省去开发相应功能的时间和精力。
例如system函数就可以满足我们的需求,可是我们经常需要获取命令执行后的返回信息,可以通过以下方法:
以ping命令为例:
#include <stdio.h>
#include <sys/types.h>
int main(int argc, char *argv[])
{
int ret=-1;
char cmd_buf[128]={0};
char buf[128]={0};
FILE *fp;
int pingSize = 56;
int pingCount = 7;
char pingAddr[]={"172.16.158.50"};
sprintf(cmd_buf,"ping %s -c %d -s %d",pingAddr, pingCount, pingSize); // 构造ping命令
fp = popen(cmd_buf,"r"); // 打开管道
while(fgets(buf,sizeof(buf),fp)!=NULL) // 获取每行的返回信息
{
printf("%s",buf);
}
pclose(fp);
ret = 0;
return ret;
}
以上的程序中,使用popen函数来执行命令。
popen函数会调用fork来创建一个子进程,子进程里调用/bin/sh来执行命令。popen函数会创建一个管道连接到子进程的标准输出,返回一个文件指针,随后用该文件指针读取命令执行的返回信息。
popen函数说明请参见man popen。
后续:
int myPipe(char *command, char **output)
{
FILE *fp;
char buf[4096];
int len=0;
*output=malloc(1);
strcpy(*output, "");
if((fp=popen(command, "r"))==NULL)
return(-1);
while((fgets(buf, 4096, fp)) != NULL){
len=strlen(*output)+strlen(buf);
if((*output=realloc(*output, (sizeof(char) * (len+1))))==NULL)
return(-1);
strcat(*output, buf);
}
pclose(fp);
return len;
}