Welcome 微信登录
编程资源 图片资源库 蚂蚁家优选 PDF转换器

首页 / 操作系统 / Linux / Linux系统编程之获取文件信息

利用系统调用stat()、lstat()以及fstat(),可获取与文件有关的信息,其中大部分提取自文件i节点。以上3个系统调用之间仅有的区别在于对文件的描述方式不同。1 stat()返回所命名文件的相关信息。2 lstat()与stat()类似,区别在于如果文件属于符号链接,那么所返回的信息针对的是符号链接自身(而非符号链接所指向的文件)。3 fstat()则返回由某个打开文件描述符所指代文件的相关信息。系统调用stat()和lstat()不需要对所操作的文件本身拥有任何权限,但针对指定pathname的父目录要有执行(搜索)权限。而只要为它提供有效的文件描述符,fstat()系统调用总是成功的。Linux stat函数讲解(获取文件详细信息) http://www.linuxidc.com/Linux/2011-08/40701.htm《Unix环境高级编程》(第二版)apue.h的错误 http://www.linuxidc.com/Linux/2011-04/34662.htmUnix环境高级编程第二版读书笔记 http://www.linuxidc.com/Linux/2011-04/34235.htm《Unix环境高级编程》中apue.h的问题 http://www.linuxidc.com/Linux/2013-01/77686.htm上述所有系统调用都会在缓冲区中返回一个由statbuf指向的stat结构,其格式如下:        设备ID和i节点号st_dev字段标识文件所驻留的设备。st_ino字段包含了文件的i节点号。利用这两个字段,可以在所有文件系统中唯一表示某个文件。如果是针对设备的i节点,那么st_rdev字段则包含设备的主、辅ID。利用宏major()和minor(),可以提取主、辅ID。在Linux系统上,要使用这两个宏,需要定义_BSD_SOURCE宏,然后include定义这两个宏的头文件<sys/types.h>。由于major()和minor()所返回的整型值大小随UINX实现的不同而各有不用。为保证可移植性,打印时总是将返回值强制转换为long。 文件所有权st_uid和st_gid字段分别表示文件的属主(用户ID)和属组(组ID)。链接数st_nlink字段包含了指向文件的(硬)链接数。文件类型及权限st_mode字段内含有位掩码,起表示文件类型和指定文件权限的双重作用。下图为该字段所含各位的布局情况。
文件类型权限
    UGTRWXRWXRWX
Linux使用了st_mode字段中的4位来标识文件类型位。st_mode字段与常量S_IFMT相与(&),可从该字段中提取出文件类型。将计算结果与一系列常量进行比较,即可确定文件类型:if((statbuf.st_mode & S_IFMT) == S_IFREG)printf(“regularfile ”);在Linux中可利用标准宏将其简化:if(S_ISREG(statbuf.st_mode))printf(“regularfile ”);
常 量测 试 宏文 件 类 型
S_IFREGS_ISREG()常规文件
S_IFDIRS_ISDIR()目录
S_IFCHRS_ISCHR()字符设备
S_IFBLKS_ISBLK()块设备
S_IFIFOS_ISFIFO()FIFO或管道
S_IFSOCKS_ISSOCK()套接字
S_IFLNKS_ISLNK()符号链接
针对stat结构中的st_mode来检查文件类型的宏想从<sys/stat.h>中获取S_IFSOCK和S_ISSOCK()的定义,必须定义_BSD_SOURCE特性测试宏,或将_XOPEN_SOURCE定义为不小于500的值。st_mode字段的低12位定义了文件权限。最低9位分别用来表示文件属主、属组以及其他用户的读、写、执行权限。文件大小、已分配块以及最优I/O块大小对于常规文件,st_size字段表示文件的字节数。对于符号链接,st_size字段则表示链接所指路径名的长度,以字节为单位。对于共享内存对象,该字段则表示对象的大小。st_blocks字段表示分配给文件的总块数,块大小为512字节,其中包括了为指针块所分配的空间。st_blocks字段记录了实际分配给文件的磁盘块数量。如果文件内含空洞,该值将小于从相应文件字节数字段(st_size)的值。st_blksize字段所指并非底层文件系统的块大小,而是针对文件系统上文件进行I/O操作时的最优块大小(以字节为单位)。一般而言,st_blksize的返回值为4096。更多详情见请继续阅读下一页的精彩内容: http://www.linuxidc.com/Linux/2014-06/103005p2.htm