在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函数获取命令执行返回结果相关推荐

  1. Linux下使用system()函数一定要谨慎

    转载自:http://my.oschina.net/renhc/blog/53580 linux尽量避免使用system. 曾经的曾经,被system()函数折磨过,之所以这样,是因为对system( ...

  2. Linux下通过gettimeofday函数获取程序段执行时间

    在Linux下计算某个程序段执行的时间一般使用gettimeofday函数,此函数的声明在sys/time.h文件中.此函数接收两个结构体参数,分别为timeval.timezone.         ...

  3. 【C/C++】Linux下使用system()函数一定要谨慎

    曾经的曾经,被system()函数折磨过,之所以这样,是因为对system()函数了解不够深入.只是简单的知道用这个函数执行一个系统命令,这远远不够,它的返回值.它所执行命令的返回值以及命令执行失败原 ...

  4. linux windows c system 函数简介

    windows 在windows下的system函数中命令可以不区别大小写!  功 能: 发出一个DOS命令 #include <stdlib.h>int system(char *com ...

  5. linux getline参数,Linux下的getline函数

    最近在做国嵌的mp3项目,在mp3主控程序中用到了这个函数,挺好使的,在这里记录一下.注意是linux下的,不是C++中的. 函数原型 ssize_t getline(char **lineptr, ...

  6. [转帖]关于Linux下的icotl函数

    关于Linux下的icotl函数 最近接触android开发,因为有时间所以就关注了下android的源码,在跟踪源码过程中到最后都会遇到icotl函数,虽然在Symbian中曾经遇到过RSocket ...

  7. linux常用调试,linux下gdb常用的调试命令

    用gdb调试程序时,常常很困惑一些命令的使用,要么是不知道这个命令,要么忘了命令的使用方法.接下来是小编为大家收集的linux下gdb常用的调试命令,希望能帮到大家. linux下gdb常用的调试命令 ...

  8. linux下tar命令解压缩,tar解压缩命令 Linux下的tar压缩解压缩命令详解

    <tar解压缩命令 Linux下的tar压缩解压缩命令详解>由会员分享,可在线阅读,更多相关<tar解压缩命令 Linux下的tar压缩解压缩命令详解(14页珍藏版)>请在人人 ...

  9. Linux下关于snmp的snmpwalk命令

    最近需要在Linux下使用Snmp的snmpwalk命令读取一些设备信息,本机已安装SNMP但是在执行命令的时候却提示:"-bash: snmpwalk: command not found ...

最新文章

  1. c 找文件服务器文件,Linux C/C++项目:虚拟文件服务器(功能匹配百度网盘)
  2. xml操作类(转载)
  3. 零基础Java学习之成员变量
  4. malloc calloc realloc的对比
  5. getoutputstream java_java socket getInputStream getOutputStream
  6. jquery-演练-表格的模态框新增与点击删除功能
  7. python基于SMTP发送邮件(qq邮箱)
  8. 用python画渐变的圆_python画环形图的方法
  9. Windows Message ID 常量列表
  10. 使用ASP.NET Atlas ItemView控件显示集合中的单个数据
  11. 模拟器:思科 配置静态路由+下一跳如何配置,使三个路由器相互通信
  12. 手把手教你申请计算机软件著作权(1)——填写软著申请表
  13. 【Python】PEP8规范中一些需要注意的地方
  14. Linux——基于GPU的超低延迟远程桌面Parsec
  15. AC日记——Two poj 1849
  16. matlab 局部极值点,matlab 图像局部求极值
  17. 视频教程-嵌入式读图基础-智能硬件
  18. 常见的登录逻辑漏洞总结
  19. AlphaStar的游戏——星际争霸2 AI综述
  20. DS串应用—最长重复子串

热门文章

  1. 实战演示k8s部署go服务,实现滚动更新、重新创建、蓝绿部署、金丝雀发布
  2. 王兴,带头围观了华为第一辆车
  3. Xmind升级pro教程
  4. foss测试_值得关注的5个人道主义FOSS项目
  5. 你见过这样的爹娘和老婆吗(看的我都哭了)
  6. Youtube 上最赚钱的人,前三名我哭了两次
  7. Java实现客户端向服务器端定时上传数据
  8. 如何利用JAVA编写一个简单的石头剪刀布的小游戏
  9. 告别卸载软件难 四大方法轻松搞定
  10. 假设检验中的显著性水平与p值