通过shell实现对于文件的处理和指令结果的处理

//基础实现函数
/***************************************************
//处理函数: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 }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值