shell的功能比较强大,很多时候直接调用system()创建一个单独进程去跑。如果我们只想知道命令是否执行成功,判断system的返回值等信息即可,但是有时候我们想要获取该命令执行之后的输出信息。
可以使用 popen()创建并写入管道,再fgets()读管道得到命令的输出。
如果数据量比较大,有时候需要配合管道符号 | 还有grep命令,awk来筛选信息
下面使用了两次popen,第一次是查找文件的文件,第二次是ls -l命令,配合awk输出第五列的信息(即文件的大小信息),当然也可以使用stat结构来获取啦,只是做个演示罢了,谢谢~
int getSystemShellReture()
{
char cmd[128] = "find / -name Polaris";
char result[128] = {0};
FILE *fp = NULL;
fp = popen(cmd,"r");
if(fp == NULL)
{
printf("popen error\n");
return -1;
}
// 读管道,得到输出
if(fgets(result,sizeof(result),fp) == NULL)
{
printf("fgets error\n");
return -1;
}
printf("Location of file : %s\n",result);
pclose(fp);
int lastIndex = strlen(result);
// 需要把最后的换行符替换为字符串结束符,否则下方结合管道时候,会只执行前半段,后半段会有问题
printf("lastIndex = %ld\n",lastIndex);
if(result[lastIndex-1] == '\n')
{
result[lastIndex-1] = '\0';
}
// 输出第五项
snprintf(cmd,sizeof(cmd),"ls -l %s | awk '{print $5}'",result);
fp = popen(cmd,"r");
if(fp == NULL)
{
printf("popen error\n");
return -1;
}
// 读管道
if(fgets(result,sizeof(result),fp) == NULL)
{
printf("fgets error\n");
return -1;
}
printf("Info of file : %s\n",result);
// 转换字符串为数字
int fileSize = 0;
sscanf(result,"%d",&fileSize);
printf("fileSize = %ld,-100 = %ld\n",fileSize,fileSize-100);
pclose(fp);
return 0;
}