在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 result
while(fgets(pRetMsg, msg_len, fp) != NULL)
{
//printf("%s",pRetMsg); //print all info
if(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 info
fp = 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 info
char 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 info
memset(&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 0
got 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