获取Linux系统Mount情报之函数用法说明(getmntent setmntent endmntent getmntent_r)

一个运行几十天甚至几个月的Linux系统中,往往运行着很多很多的监视软件,用来监视系统的状态。

对于Linux系统Mount情报的获取,网上很多帖子都有说明,在此不在多赘述。

 

关于Linux系统管理Mount信息的两个文件“/etc/mtab”和“/etc/fstab”,其中的每一行数据都是Mount情报。

我们可以通过读取mtab文件的中的情报,得到当前已经Mount的所有分区,通过如下函数读取:

【概要说明】

#include <stdio.h>
#include <mntent.h>

FILE *setmntent(const char *filename, const char *type);

struct mntent *getmntent(FILE *stream);

int addmntent(FILE *stream, const struct mntent *mnt);

int endmntent(FILE *streamp);

char *hasmntopt(const struct mntent *mnt, const char *opt);

/* GNU extension */
#include <mntent.h>

struct mntent *getmntent_r(FILE *streamp, struct mntent *mntbuf,
                                  char *buf, int buflen);

【使用getmntent_r代码片段】

#include <stdio.h>
#include <string.h>
#include <mntent.h>

int main(void) {
    FILE* mtab;
    struct mntent mnt;
    char strings[1024];

    memset(&mnt,0x00,sizeof(mnt));
    memset(&strings[0],0x00,sizeof(strings));
    mtab = setmntent("/etc/mtab", "r");
    
    while ((NULL != getmntent_r(mtab, &mnt, strings, sizeof(strings)))) 
    {
        if (strcmp(mnt.mnt_dir,""))
        {
            if(!strcmp(mnt.mnt_fsname,"/dev/sda1"))
            {
                printf(" sda1 Mount OK \r\n");
            }
            printf(" mnt_fsname [%s],mnt_dir [%s],mnt_type [%s],mnt_opts [%s], \
                    mnt_freq [%d],mnt_passno [%d].. \r\n", \
                    mnt.mnt_fsname,mnt.mnt_dir,mnt.mnt_type, \
                    mnt.mnt_opts,mnt.mnt_freq,mnt.mnt_passno);
        }
    }
    (void)endmntent(mtab);

    return 0;
}

【使用getmntent代码片段】

#include <stdio.h>
#include <string.h>
#include <mntent.h>

int main(void) {
    FILE* mtab;
    struct mntent *mnt_p;

    mtab = setmntent("/etc/mtab", "r");
    
    while ((mnt_p = getmntent(mtab)) != NULL) 
    {
        if (strcmp(mnt_p->mnt_dir,""))
        {
            if(!strcmp(mnt_p->mnt_fsname,"/dev/sda1"))
            {
                printf(" sda2 Mount OK \r\n");
            }
            printf(" mnt_fsname [%s],mnt_dir [%s],mnt_type [%s],mnt_opts [%s], \
                    mnt_freq [%d],mnt_passno [%d].. \r\n", \
                    mnt_p->mnt_fsname,mnt_p->mnt_dir,mnt_p->mnt_type, \
                    mnt_p->mnt_opts,mnt_p->mnt_freq,mnt_p->mnt_passno);
        }
    }
    (void)endmntent(mtab);

    return 0;
}

很多人不明白getmntent函数和getmntent_r函数的区别,引用一段话:

The reentrant getmntent_r() function is similar to getmntent(), but stores the struct mount in the provided *mntbuf and stores the strings pointed to by the entries in that struct in the provided array buf of size buflen.

如果多个人同时调用getmntent会有问题,此时你需要用getmntent_r函数。

 

大家如果有更明白的,可以留言,我会修改补充。

 

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
setmntent函数是一个C库函数,用于打开和操作mntent结构的文件。mntent结构是用于描述挂载点信息的结构体。setmntent函数的原型如下: ```c #include <mntent.h> FILE *setmntent(const char *filename, const char *type); ``` setmntent函数接受两个参数:filename和type。filename是一个字符串,表示要打开的文件的路径。type是一个字符串,表示要执行的操作类型。setmntent函数返回一个指向mntent结构的文件指针。 以下是一个使用setmntent函数的示例: ```python import ctypes # 定义mntent结构体 class mntent(ctypes.Structure): _fields_ = [ ("mnt_fsname", ctypes.c_char_p), ("mnt_dir", ctypes.c_char_p), ("mnt_type", ctypes.c_char_p), ("mnt_opts", ctypes.c_char_p), ("mnt_freq", ctypes.c_int), ("mnt_passno", ctypes.c_int) ] # 加载libc库 libc = ctypes.CDLL("libc.so.6") # 打开mntent结构的文件 mnt_file = libc.setmntent("/etc/mtab", "r") # 读取mntent结构的文件内容 mnt_entry = mntent() while libc.getmntent_r(mnt_file, ctypes.byref(mnt_entry), ctypes.byref(mnt_entry)) is not None: print("Filesystem: ", mnt_entry.mnt_fsname.decode()) print("Mount point: ", mnt_entry.mnt_dir.decode()) print("Type: ", mnt_entry.mnt_type.decode()) print("Options: ", mnt_entry.mnt_opts.decode()) print("Frequency: ", mnt_entry.mnt_freq) print("Pass number: ", mnt_entry.mnt_passno) # 关闭mntent结构的文件 libc.endmntent(mnt_file) ``` 这个示例演示了如何使用setmntent函数打开并读取mntent结构的文件。它打开了"/etc/mtab"文件,并逐行读取文件内容,然后打印出每个挂载点的信息。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值