在arm上嵌入式开发的时候遇到了一个这样的问题,实现的功能是正确的,但是在运行过程中,同一个算子在计算的时候会随机出现计算错误的现象;为了快速的还原错误环境,就需要将计算的结果和正确的结果对比;由于数据量比较大,所以采用的是保存到文件中,利用md5sum去对比。但是在运行C++程序的时候,需要获取Linux系统指令运行的结果,故写下了这边博客。
需要用到C中的popen、pclose、fgets三个函数接口,如下所示:
1. FILE * popen(const char * command, const char * type)
头文件:#include <stdio.h>
函数说明:popen()会调用fork()产生子进程,然后从子进程中调用/bin/bash/sh -c 来执行参数command的指令。
参数说明:
command:指令;
type:r调用进程读取command的标准输出;w调用进程写到command的标准输入;
返回值说明:
如果成功返回文件指针,如果失败返回NULL,错误原因存于errno中。
2. int pclose ( FILE * stream )
头文件:#include <stdio.h>
函数说明:用来关闭由popen所建立的管道及文件指针。
参数说明:
stream:为popen()所返回的文件指针。
返回值说明:
如果成功返回shell的终止状态,若出错返回-1,错误原因,原因存于errno中。
3. char *fgets(char *str, int n, FILE *stream)
头文件:#include <stdio.h>
函数说明:从指定的流stream读取一行,并把它存储在str所指向的字符串内。当读取(n-1)个字符时,或读取到换行符时,或者到达文件末尾,会停止。
参数说明:
str:指向一个字符数组的指针,该数组存储了要读取的字符串;
n:读取的最大字符数。通常为str的数组长度
stream:指向FILE对象的指针,该FILE对象标识了要从中读取字符的流
返回值说明:
如果成功返回相同的str参数,如果到达文件末尾或者没有读取到任何字符,str的内容不良,并返回一个空指针,如果发生错误,返回一个空指针。
主要使用的函数已经做了简单的解释说明,下面直接是源码
/**
*@用与获取cmd指令运算的结果,并将cmd执行后的输出结果保存到code中
*@param[0] cmd 需要运行的指令
*@param[1] code 将指令的输出结果保存在该字符串中
**/
void aiden_system(const char *cmd, std::string& code)
{
char result[10240] = {0};
char buf[1024] = {0};
FILE *fp = NULL;
if( (fp = popen(cmd, "r")) == NULL ) {
printf("popen error!\n");
return;
}
while (fgets(buf, sizeof(buf), fp)) {
strcat(result, buf);
}
pclose(fp);
printf("result: %s\n", result);
std::string code_ = std::string(result);
code = std::string(result);
}