Linux下使用system函数获取命令执行返回结果
在Linux C语言中,需要获取设备挂载和空间容量信息,这时候最简单的方式就是使用命令工具进行查询,但是system函数调用之能返回进行执行的状态,不能返回执行的结果;所以这里自己实现system函数返回命令执行的结果,以获取设备挂载信息和容量信息。
代码
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <errno.h>#define MTAB_INFO_FILE "/proc/mounts"
#define HDD_MOUNT_DIR "yubo.wang"
#define SD_MOUNT_DIR "yubo.wang"
#define BACK_MOUNT_DIR "yubo.wang"
#define CMD_DF "df -k"struct vpu_device_info {char devnode[32];unsigned long long size;unsigned long long used;unsigned long long avail;char usep[32];char mountdir[32];
};struct vpu_device_info v_hdd_info;
struct vpu_device_info v_sd_info;
struct vpu_device_info v_back_info;/* just get lastest info */
int _System(const char * cmd, char *pRetMsg, int msg_len)
{FILE * fp;int res = -1;int ret = -1;if (cmd == NULL || pRetMsg == NULL || msg_len < 0){printf("Param Error!\n");return -1;}if ((fp = popen(cmd, "r") ) == NULL){printf("Popen Error!\n");return -2;}else{memset(pRetMsg, 0, msg_len);//get lastest resultwhile(fgets(pRetMsg, msg_len, fp) != NULL){//printf("%s",pRetMsg); //print all infoif(NULL != strstr(pRetMsg, HDD_MOUNT_DIR)){printf("got df info:\n");ret = 0;break;}}if ((res = pclose(fp)) == -1){printf("close popenerror!\n");return -3;}pRetMsg[strlen(pRetMsg)-1] = '\0';return ret;}
}static void get_hdd_stat(struct vpu_device_info * hddinfo, char *stat)
{if (NULL == hddinfo || NULL == stat) {printf("%s : %s\n", __func__, strerror(errno));return;}sscanf(stat, "%s %llu %llu %llu %s %s", hddinfo->devnode, &hddinfo->size, &hddinfo->used, &hddinfo->avail, hddinfo->usep, hddinfo->mountdir);printf("got size info:\n%s %llu %llu %llu %s %s\n", hddinfo->devnode, hddinfo->size, hddinfo->used, hddinfo->avail, hddinfo->usep, hddinfo->mountdir);
}int main(){FILE * fp;char mtd_info[1024] = {0,};int ret = 0;//1.check mount infofp = fopen(MTAB_INFO_FILE, "r");if (!fp) {printf("%s : %s\n", __func__, strerror(errno));return -1;}while(!feof(fp)){memset(mtd_info, 0, sizeof(mtd_info));if (!fgets(mtd_info, sizeof(mtd_info), fp)) {printf("%s : %s\n", __func__, strerror(errno));return -2;}if(NULL != strstr(mtd_info, HDD_MOUNT_DIR)){printf("got mount info:\n");printf("%s\n",mtd_info);break;}}fclose(fp); //2.get df infochar a8Result[1024] = {0,};memset(a8Result, 0, sizeof(a8Result));ret = _System(CMD_DF, a8Result, sizeof(a8Result));printf("ret = %d \na8Result = %s\nlength = %ld \n\n", ret, a8Result, sizeof(a8Result)); //3.get size infomemset(&v_hdd_info, 0, sizeof(struct vpu_device_info));get_hdd_stat(&v_hdd_info, a8Result);return 0;
}
编译测试
got mount info:
/dev/sda3 /home/logread/yubo.wang ext4 rw,relatime,data=ordered 0 0got df info:
ret = 0
a8Result = /dev/sda3 153764624 37948184 107935740 27% /home/logread/yubo.wang
length = 1024 got size info:
/dev/sda3 153764624 37948184 107935740 27% /home/logread/yubo.wang
Linux下使用system函数获取命令执行返回结果相关推荐
- Linux下使用system()函数一定要谨慎
转载自:http://my.oschina.net/renhc/blog/53580 linux尽量避免使用system. 曾经的曾经,被system()函数折磨过,之所以这样,是因为对system( ...
- Linux下通过gettimeofday函数获取程序段执行时间
在Linux下计算某个程序段执行的时间一般使用gettimeofday函数,此函数的声明在sys/time.h文件中.此函数接收两个结构体参数,分别为timeval.timezone. ...
- 【C/C++】Linux下使用system()函数一定要谨慎
曾经的曾经,被system()函数折磨过,之所以这样,是因为对system()函数了解不够深入.只是简单的知道用这个函数执行一个系统命令,这远远不够,它的返回值.它所执行命令的返回值以及命令执行失败原 ...
- linux windows c system 函数简介
windows 在windows下的system函数中命令可以不区别大小写! 功 能: 发出一个DOS命令 #include <stdlib.h>int system(char *com ...
- linux getline参数,Linux下的getline函数
最近在做国嵌的mp3项目,在mp3主控程序中用到了这个函数,挺好使的,在这里记录一下.注意是linux下的,不是C++中的. 函数原型 ssize_t getline(char **lineptr, ...
- [转帖]关于Linux下的icotl函数
关于Linux下的icotl函数 最近接触android开发,因为有时间所以就关注了下android的源码,在跟踪源码过程中到最后都会遇到icotl函数,虽然在Symbian中曾经遇到过RSocket ...
- linux常用调试,linux下gdb常用的调试命令
用gdb调试程序时,常常很困惑一些命令的使用,要么是不知道这个命令,要么忘了命令的使用方法.接下来是小编为大家收集的linux下gdb常用的调试命令,希望能帮到大家. linux下gdb常用的调试命令 ...
- linux下tar命令解压缩,tar解压缩命令 Linux下的tar压缩解压缩命令详解
<tar解压缩命令 Linux下的tar压缩解压缩命令详解>由会员分享,可在线阅读,更多相关<tar解压缩命令 Linux下的tar压缩解压缩命令详解(14页珍藏版)>请在人人 ...
- Linux下关于snmp的snmpwalk命令
最近需要在Linux下使用Snmp的snmpwalk命令读取一些设备信息,本机已安装SNMP但是在执行命令的时候却提示:"-bash: snmpwalk: command not found ...
最新文章
- c 找文件服务器文件,Linux C/C++项目:虚拟文件服务器(功能匹配百度网盘)
- xml操作类(转载)
- 零基础Java学习之成员变量
- malloc calloc realloc的对比
- getoutputstream java_java socket getInputStream getOutputStream
- jquery-演练-表格的模态框新增与点击删除功能
- python基于SMTP发送邮件(qq邮箱)
- 用python画渐变的圆_python画环形图的方法
- Windows Message ID 常量列表
- 使用ASP.NET Atlas ItemView控件显示集合中的单个数据
- 模拟器:思科 配置静态路由+下一跳如何配置,使三个路由器相互通信
- 手把手教你申请计算机软件著作权(1)——填写软著申请表
- 【Python】PEP8规范中一些需要注意的地方
- Linux——基于GPU的超低延迟远程桌面Parsec
- AC日记——Two poj 1849
- matlab 局部极值点,matlab 图像局部求极值
- 视频教程-嵌入式读图基础-智能硬件
- 常见的登录逻辑漏洞总结
- AlphaStar的游戏——星际争霸2 AI综述
- DS串应用—最长重复子串