//基础实现函数
/***************************************************
//处理函数:ql_send_shell_command_with_response
//函数功能:实现所有shell指令结果输出到C语言里面的buff中
//参数:cmd:传入的指令,response:返回的结果,response_len:返回结果的长度
**************************************************/
QL_ERROR_CODE ql_send_shell_command_with_response(const char cmd,char response,int response_len)
{
FILE stream = NULL;
char res_buff[1024]={0};
char res_buff_t[4096]={0};
if(NULL == (stream=popen(cmd,"r")))
{
QL_APP_LOGE(LOG_TAG, "exec command failed:%s.",strerror(errno));
return QL_ERR_GENERAL_FAILED;
}
while(NULL != fgets(res_buff,sizeof(res_buff),stream))
{
QL_APP_LOGI(LOG_TAG, "response=%s.",res_buff);
strcat(res_buff_t,res_buff);
if(response_len < strlen(res_buff_t))
{
QL_APP_LOGE(LOG_TAG, "response length is not enough.");
pclose(stream);
return QL_ERR_GENERAL_FAILED;
}
}
res_buff_t[strlen(res_buff_t)-1] = '\0';
memcpy(response,res_buff_t,strlen(res_buff_t));
pclose(stream);
return QL_ERR_GENERAL_SUCCESS;
}
应用:
//1、获取文件的某几行某几列的内容
char response_buff[128] = {0};
//获取文件的前三行的第一、二列
char cmd[64] = “cat /proc/meminfo |head -n 3|awk ‘{print $1 $2}’”;
//返回结果存放在response_buff里面
QL_ERROR_CODE ret = ql_send_shell_command_with_response(cmd,response_buff,128);
//2、获取shell指令结果的某些字段
//获取shell指令执行的结果
char buff_total[32] = {0}, buff_free[32] = {0}, response_buff[128] = {0};
//获取df指令执行的结果的某一行某一列中的这个字段到 buff里面用于C语言的函数的处理
char cmd_total[64] = “df |grep ubi0:system |awk ‘{print $2}’”;
char cmd_free[64] = “df |grep ubi0:system |awk ‘{print $4}’”;
QL_ERROR_CODE ret_total = ql_send_shell_command_with_response(cmd_total,buff_total,32);
QL_ERROR_CODE ret_free = ql_send_shell_command_with_response(cmd_free,buff_free,32);
2、C语言和shell之间互通的桥梁
可以传递多个,字符串变量等参数
2380 /*===========================================================================
2381 FUNCTION ql_os_system
2382 ===*/
2383 /**
2384 system call
2385 @param[in] fmt command for format string.
2386 @param[out]
2387 none
2388 @return On success, Zero is returned. On error, -1 is returned.
2389 @dependencies
2390 none
2391 @sideeffects
2392 none
2393 @LastEditors:eric.liu
2394 /
2395 /=*/
2396 uint16 ql_os_system(const char *fmt, …)
2397 {
2398 va_list ap;
2399 va_list ap_temp;
2400 int size = 0;
2401 char *command = NULL;
2402 FILE *fp = NULL;
2403
2404 va_start(ap, fmt);
2405 va_copy(ap_temp, ap);
2406 size = vsnprintf(NULL, 0, fmt, ap_temp);
2407 va_end(ap_temp);
2408 if(size > 0) {
2409 command = (char *)malloc(size+1);
2410 if(!command) {
2411 va_end(ap);
2412 return 0xff;
2413 }
2414 vsnprintf(command, size+1, fmt, ap);
2415 if(NULL == (fp = popen(command, “w”))) {
2416 va_end(ap);
2417 free(command);
2418 return 0xff;
2419 }
2420
2421 free(command);
2422 pclose(fp);
2423 }
2424 va_end(ap);
2425 return 0;
2426 }