- 论坛徽章:
- 0
|
aix不像linux一样,在/etc/mtab中保存着已经挂载的信息,要获得已获得挂载文件系统列表有几种方法:
1.通过pipe管道或伪终端执行一个mount命令并从中一行一行地读取信息并解析字段。但是得创建新进程,
开销比较大。这个一个很万能的方法,几乎所有系统已有程序支持的功能,你都可以用这个办法在C/C++代
码中实现。本人比较鄙弃这种方法,不到万不得已,不喜欢这么做。
2.调用系统的API,mntctl函数。下面就通过例子介绍这个函数的使用。
mntctl函数的声明:
http://publib.boulder.ibm.com/infocenter/pseries/v5r3/index.jsp
#include
#include
#include
int mntctl ( Command, Size, Buffer)
int Command;
int Size;
char *Buffer;
详细参数说明及返回值说明可参见
http://publib.boulder.ibm.com/infocenter/pseries/v5r3/index.jsp
,
在这里我就不重复网上已经有的东西。
例子:
通常代码是最能说明问题的,也是程序员有时候更愿意看到的,这里
/**
* @file mntctl.c
*
* @brief test for function mntctl()
*
* @details
*
* @version 1.0
* @date 07/22/09 14:26:38
*
* @author Jitashan(Jts),
*/
#include
#include //for mntctl
#include //for struct vmount
#include
#include
#define INFO(fmt, ...) fprintf(stdout, fmt"\n", ##__VA_ARGS__);
#define ERR(fmt, ...) fprintf(stdout, "[%d in %s]"fmt"\n", __LINE__, __FILE__, ##__VA_ARGS__);
#define BUF_SIZE 4096
/**
* @briefprint a struct vmount info
*/
void printvmnt(struct vmount * vmnt)
{
char * ptr = NULL;
char * type = NULL;
switch(vmnt->vmt_gfstype)
{
//有很多文件系统类型,未一一列举
ase MNT_J2:
type = "jfs2";
break;
case MNT_JFS:
type = "JFS";
break;
case MNT_NFS:
type = "NFS";
break;
case MNT_CDROM:
type = "CDROM";
break;
default:
type = "UNKNOWNED";
break;
}
//vfs type
INFO("type=[%s]", type);
ptr = (char *)vmnt;//指向结构头部的指针
//vmt_data的vmt_off表示的是对应的字段相对结构头部的偏移量,
//vmt_size表示的是对应字段的大小
//宏VMT_XXXXXX是vmt_data数组的小标
//device name
INFO("vmt_data[VMT_OBJECT]=%s", ptr+vmnt->vmt_data[VMT_OBJECT].vmt_off);
//mount point
INFO("vmt_data[VMT_STUB]=%s", ptr+vmnt->vmt_data[VMT_STUB].vmt_off);
//host
INFO("vmt_data[VMT_HOST]=%s", ptr+vmnt->vmt_data[VMT_HOST].vmt_off);
//hostname
INFO("vmt_data[VMT_HOSTNAME]=%s", ptr+vmnt->vmt_data[VMT_HOSTNAME].vmt_off);
//info
INFO("vmt_data[VMT_INFO]=%s", ptr+vmnt->vmt_data[VMT_INFO].vmt_off);
//mount's args
INFO("vmt_data[VMT_ARGS]=%s", ptr+vmnt->vmt_data[VMT_ARGS].vmt_off);
return;
}
int main(void)
{
char buf[BUF_SIZE];
int ncnt;
int i=0;
char * ptr = NULL;
struct vmount * vmnt = NULL;
memset(buf, 0x00, sizeof(char)*BUF_SIZE);
ncnt = mntctl(MCTL_QUERY, BUF_SIZE, buf); //buf的大小不需足够大,否则返回0,并把
//需要的大小写在buf的第一个word里面,这里这是
if(ncnt vmt_length; //struct vmount是一个可变大小的结构体,所以不能用sizoef(struct vmount)
}
}
执行结果:
[p630:jts:/home/jts/test]./mntctl
ncnt[8]
type=[jfs2]
vmt_data[VMT_OBJECT]=/dev/hd4
vmt_data[VMT_STUB]=/
vmt_data[VMT_HOST]=-
vmt_data[VMT_HOSTNAME]=-
vmt_data[VMT_INFO]=
vmt_data[VMT_ARGS]=rw,log=/dev/hd8
type=[jfs2]
vmt_data[VMT_OBJECT]=/dev/hd2
vmt_data[VMT_STUB]=/usr
vmt_data[VMT_HOST]=-
vmt_data[VMT_HOSTNAME]=-
vmt_data[VMT_INFO]=
vmt_data[VMT_ARGS]=rw,log=/dev/hd8
type=[jfs2]
vmt_data[VMT_OBJECT]=/dev/hd9var
vmt_data[VMT_STUB]=/var
vmt_data[VMT_HOST]=-
vmt_data[VMT_HOSTNAME]=-
vmt_data[VMT_INFO]=
vmt_data[VMT_ARGS]=rw,log=/dev/hd8
type=[jfs2]
vmt_data[VMT_OBJECT]=/dev/hd3
vmt_data[VMT_STUB]=/tmp
vmt_data[VMT_HOST]=-
vmt_data[VMT_HOSTNAME]=-
vmt_data[VMT_INFO]=
vmt_data[VMT_ARGS]=rw
type=[jfs2]
vmt_data[VMT_OBJECT]=/dev/hd10opt
vmt_data[VMT_STUB]=/opt
vmt_data[VMT_HOST]=-
vmt_data[VMT_HOSTNAME]=-
vmt_data[VMT_INFO]=
vmt_data[VMT_ARGS]=rw,log=/dev/hd8
type=[jfs2]
vmt_data[VMT_OBJECT]=/dev/oracle_lv
vmt_data[VMT_STUB]=/database
vmt_data[VMT_HOST]=-
vmt_data[VMT_HOSTNAME]=-
vmt_data[VMT_INFO]=
vmt_data[VMT_ARGS]=rw,log=/dev/hd8
本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u2/73874/showart_2003703.html |
|