linux中getmntent、setmntent 、endmntent 函数的详细用法

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/lixiaogang_theanswer/article/details/79431318
1.在使用getmntent、setmntent 、endmntent这3个函数之前,先对这3个函数的功能作一个详细的介绍,在使用这3个函数得包含头文件#include<stdio.h>和#include<mntent.h>

(1)setmntent:打开文件系统描述文件的文件名,并且返回可以被使用的文件指针getmntent().

其函数原型为:
FILE * setmntent(const char * filename ,const char * type );
参数:filename  要打开的文件名字
	 type      表示打开文件的方式(r:只读 w:只写  r+:读写)等。
返回值:函数成功返回指向打开文件的文件指针FILE;失败返回NULL。

(2)getmntent:函数读取文件系统的下一行来自文件流的描述文件并返回指向结构的指针(即循环读取文件)

其函数原型:
struct mntent * getmntent(FILE * fp );
参数:fp  		setmntent函数中返回的文件指针,即将要进行读写的文件指针。
返回值:struct mntent 结构体,后面将会详细介绍该结构体的中变量和对应的作用。  

(3)endmntent:关闭流和与其相关联的文件系统描述文件。

其函数原型:
int endmntent(FILE * fp );
参数:fp  函数setmntent打开的文件指针
返回值:该函数总是返回1.

除这3个函数外,与其一起配合使用的还有下面这几个函数,但是用的不是很多,所以在这里只进行简单的介绍。
addmntent:可以在已开启档案的末端加上资讯,它原本是给 mount 使用的。
hasmntopt:是个比较特殊的函式。它会扫描第一个参数所传入的struct mntent,找出它的挂载选项是否符合第二个引数。假如找到选项就传回符合的子字符串的位址;否则传回NULL。

2.到这里为止,几个函数的原型、参数、返回值和器功能都已经描述差不多了,那究竟在什么时候会用到这几个函数?怎么来用?去哪里读取加载的磁盘和文件信息?
(1)linux系统的宗旨是“一切皆文件”,在linux系统下面进行项目开发时,离不开这几个话题:系统的硬盘大小,内存利用率如何,cpu占用情况等。为了获取设备的信息我们就会使用到这几个函数以来实时获取并了解"加载的磁盘和各种文件信息"。
(2)linux系统下所有的文件或设备都可以当作文件,框架是一个根"/"目录下的一个树型结构,下面有着多个目录,各目录的含义和作用不同。/etc为linux下的系统配置文件目录,该目录下面有着很多的与系统相关的配置文件,如下:(ubuntu 16.4版本,不同版本其文件名或数量不尽相同,但是整体上大同小异)

acpi                           compizconfig         fstab.d            insserv.conf     mailcap           pki                      rsyslog.conf       thunderbird
adduser.conf                   console-setup        fuse.conf          insserv.conf.d   mailcap.order     pm                       rsyslog.d          timezone
alternatives                   cracklib             gai.conf           iproute2         manpath.config    pnm2ppa.conf             samba              tpvmlp.conf
anacrontab                     cron.d               gconf              issue            mime.types        polkit-1                 sane.d             ucf.conf
apache2                        cron.daily           gdb                issue.net        mke2fs.conf       popularity-contest.conf  securetty          udev
apg.conf                       cron.hourly          ghostscript        kbd              modprobe.d        postgresql               security           udisks2
apm                            cron.monthly         gnome              kernel           modules           postgresql-common        selinux            ufw
apparmor                       crontab              gnome-app-install  kernel-img.conf  modules-load.d    ppp                      sensors3.conf      updatedb.conf
apparmor.d                     cron.weekly          groff              kerneloops.conf  mongodb.conf      printcap                 sensors.d          update-manager
apport                         cups                 group              ldap             mtab              profile                  services           update-motd.d
apt                            cupshelpers          group-             ld.so.cache      mtab.fuselock     profile.d                sgml               update-notifier
aptdaemon                      dbus-1               grub.d             ld.so.conf       mtools.conf       protocols                shadow             UPower
at-spi2                        dconf                gshadow            ld.so.conf.d     mysql             pulse                    shadow-            upstart-xsessions
avahi                          debconf.conf         gshadow-           legal            nanorc            python                   shells             usb_modeswitch.conf
bash.bashrc                    debian_version       gtk-2.0            libaudit.conf    netscsid.conf     python2.7                signond.conf       usb_modeswitch.d
bash_completion                default              gtk-3.0            libnl-3          network           python3                  signon-ui          vim
bash_completion.d              deluser.conf         hdparm.conf        libpaper.d       NetworkManager    python3.4                skel               vmware-tools
bindresvport.blacklist         depmod.d             host.conf          libreoffice      networks          rc0.d                    speech-dispatcher  vtrgb
blkid.conf                     dhcp                 hostname           lightdm          newt              rc1.d                    ssh                wgetrc
blkid.tab                      dictionaries-common  hosts              lintianrc        nsswitch.conf     rc2.d                    ssl                wodim.conf
bluetooth                      dnsmasq.d            hosts.allow        locale.alias     obex-data-server  rc3.d                    subgid             wpa_supplicant
brlapi.key                     doc-base             hosts.deny         localtime        opt               rc4.d                    subgid-            X11
brltty                         dpkg                 hp                 logcheck         os-release        rc5.d                    subuid             xdg
brltty.conf                    drirc                ifplugd            login.defs       pam.conf          rc6.d                    subuid-            xml
ca-certificates                emacs                iftab              logrotate.conf   pam.d             rc.local                 sudoers            xul-ext
ca-certificates.conf           environment          init               logrotate.d      papersize         rcS.d                    sudoers.d          zsh_command_not_found
ca-certificates.conf.dpkg-old  fdfs                 init.d             lsb-release      passwd            resolvconf               sysctl.conf
calendar                       firefox              initramfs-tools    ltrace.conf      passwd-           resolv.conf              sysctl.d
chatscripts                    fonts                inputrc            magic            pcmcia            rmt                      systemd
colord.conf                    fstab                insserv            magic.mime       perl              rpc                      terminfo

在/etc目录下,有这样两个文件:fstab和mtab文件。这两个文件的作用与区别如下:
(1)fstab
fstab(描述 各种文件系统的信息 )
文件/etc/fstab存放的是系统中的文件系统信息。当正确的设置了该文件,则可以通过"mount /directoryname"命令来加载一个文件系统,每种文件系统都对应一个独立的行,每行中的字段都有空格或tab键分开。同时fsck、mount、umount的等命令都利用该程序。
(2)etc/mtab文件的作用:
记载的是现在系统已经装载的文件系统,包括操作系统建立的虚拟文件等;而/etc/fstab是系统准备装载的。直接使用mount和确定就是通过查询它而来的。
fstab文件格式:
fs_spec - 该字段定义 希望加载的文件系统 所在的设备或远程文件系统
fs_file- 该字段描述 希望的文件系统 加载的目录点
fs_type- 定义了该设备上的文件系统
fs_options- 指定加载该设备的文件系统是需要使用的特定参数选项
下面是/etc/fatab文件的一个示例行:
fs_spec   fs_file  fs_type   fs_options  fs_dump fs_pass 
/dev/hda1  /     ext2    defaults    1     1 
其中:
fs_spec:设备名或者设备卷标名。该字段定义希望加载的文件系统所在的设备或远程文件系统,对于一般的本地块设备情况来说:IDE设备一般描述为/dev/hdaXN,X是IDE设备通道(a, b, or c),N代表分区号;SCSI设备一描述为/dev/sdaXN。对于NFS情况,格式一般为“IP:directory”: ,例如:knuth.aeb.nl:/'。对于procfs,使用proc’来定义。 当然,此列可以使用加载分区的label名称来代替具体的分区名称。
fs_file:设备挂载目录。该字段描述希望的文件系统加载的目录点,对于swap设备,该字段为none;对于加载目录名包含空格的情况,用40来表示空格。
fs_type:设备文件系统。此项定义了该设备上的文件系统,一般常见的文件类型为ext2 (Linux设备的常用文件类型)、vfat(Windows系统的fat32格式)、NTFS、iso9600等。
fs_options:挂载参数。指定加载该设备的文件系统是需要使用的特定参数选项,多个参数是由逗号分隔开来。对于大多数系统使用"defaults"就可以满足需要。其他常见的选项包括:
fs_dump:指明是否要备份。该选项被"dump"命令使用来检查一个文件系统应该以多快频率进行转储,若不需要转储就设置该字段为0。0为不备份,1为要备份,一般根分区要备份。
fs_pass:指明自检顺序。该字段被fsck命令用来决定在启动时需要被扫描的文件系统的顺序,根(“/”)文件系统对应该字段的值应该为1,其它文件系统对应的字段应该为2,若该文件系统无需在启动时扫描,则设置该字段为0。

  • 而函数setmntent、getmntent和entmntent主要用来访问文件系统描述文件 / etc / fstab和已挂载的文件系统描述文件/ etc / mtab。

3.getmntent函数的返回值为一个结构体变量struct mntent ,下面来对该结构体进行详细描述。
该struct mntent结构定义在<mntent.h>文件中,/usr/include/mntent.h

51 
 52 /* Structure describing a mount table entry.  */
 53 struct mntent
 54   {
 55     char *mnt_fsname;       /* 挂载文件系统的名称  */
 56     char *mnt_dir;      /*文件系统路径前缀  */
 57     char *mnt_type;     /* 挂载的文件系统类型: ufs, nfs等  */
 58     char *mnt_opts;     /*挂载选项  */
 59     int mnt_freq;       /* 以天为单位的转存频率  */
 60     int mnt_passno;     /* 并行fsck上的传递数字  */
 61   };
 62 

代码一

/*************************************************************************
 * File Name: getDeviceInf.cpp
 * Author:    The answer
 * Function:  Other        
 * Mail:      2412799512@qq.com 
 * Created Time: 2018年03月03日 星期六 16时24分52秒
 ************************************************************************/

#include<iostream>
#include<stdlib.h>
#include<stdio.h>
#include<string.h>
#include<error.h>
#include<unistd.h>
#include<mntent.h>
#include<string>
using namespace std;

#define MNT_OK 0
#define MNT_ERROR -1
#define MNT_PARAM_ERROR 2
#define MNT_OPENFILE_ERROR 3
#define MNT_MALLOC_ERROR 4

#define handleErr(err,msg) \
do{errno(err);perror(msg);exit(EXIT_FAILURE);}while(0);
int main(int argc,char **argv)
{
    /*./a.out /etc/mtab*/
  do{
         if(argc != 2)
        {
           handleErr(-1,"param is err.");
        }

        FILE *fp = NULL;
        struct mntent *mnt = NULL;
        int iRet = MNT_ERROR;
        string readfile = argv[1];

        fp = setmntent(readfile.c_str(),"r");
        if(NULL == fp)
        {
            iRet = MNT_OPENFILE_ERROR;
            handleErr(-1,"setmntent error.");
            break;
        }

        while(mnt = getmntent(fp))
        {
            cout<<mnt->mnt_fsname<<" "<<mnt->mnt_dir<<" "<<mnt->mnt_type<<" "\
               <<mnt->mnt_opts<<" "<<mnt->mnt_freq<<" "<<mnt->mnt_passno<<endl;
        }

        endmntent(fp);
        iRet = MNT_OK;

     }while(0);

    return 0;
}

这里写图片描述


博主最新开了一个网店[ 华少潮牌男装店 ],款式多样,价格实惠,质量保证。欢迎各位读者进店查看。购买时请说明是CSDN读者,优惠更大。期待你的光临!!!
在这里插入图片描述

没有更多推荐了,返回首页