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 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

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值