免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2978 | 回复: 0
打印 上一主题 下一主题

[新手入门] aix已获得挂载文件系统列表 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-07-22 16:48 |只看该作者 |倒序浏览
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
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP