fstat函数及struct stat结构

来源:互联网 发布:sql group by没有分组 编辑:程序博客网 时间:2024/06/04 18:45

 

 

 

 

一、fstat函数

 

功能:由文件描述符取得文件状态。

 

相关函数statlstat chmod chownreadlink utime

 

头文件 #include<sys/stat.h>

#include<unistd.h>

 

函数声明 int fstatint filedesstructbuf);

 

描述 fstat()用来将参数filedes所指向的文件状态复制到参数buf所指向的结构中(struct stat)。fstat()与stat()作用完全相同,不同之处在于传入的参数为已打开的文件描述符。

 

返回值:执行成功返回0,失败返回-1,错误代码保存在errno

 

下面举一个小例子:

------------------------------

#include<stdio.h>

#include<stdlib.h>

#include<sys/stat.h>

#include<unistd.h>

#include<fcntl.h>

 

main()

{

struct stat buf;

int fd;

fd = open ("/etc/passwd", O_RDONLY);

fstat (fd,&buf);

printf("/etc/passwdfile size = %d\n",(int)(buf.st_size));

}

 

------------------------------

执行结果:

/etc/passwd filesize = 1656

也许,你看到这里会产生和我一样的疑惑:这个struct stat结构到底是什么样的呢?

下面我就来详细的介绍一下它了哦~~~

 

二、struct stat结构体

定义如下:

struct stat { 

        dev_t st_dev; // 文件所在设备ID 

        ino_t st_ino; // 结点(inode)编号  

        mode_t st_mode; // 保护模式 

        nlink_t st_nlink; // 硬链接个数  

        uid_t st_uid; // 所有者用户ID  

        gid_t st_gid; // 所有者组ID  

        dev_t st_rdev; // 设备ID(如果是特殊文件) 

        off_t st_size; // 总体尺寸,以字节为单位 

        blksize_t st_blksize; //文件系统 I/O 块大小

        blkcnt_t st_blocks; //已分配 512B 块个数

        time_t st_atime; // 上次访问时间 

        time_t st_mtime; // 上次更新时间 

        time_t st_ctime; // 上次状态更改时间 

};

st_dev字段描述该文件所在的设备。(major()minor()宏可能在分析这个设备ID域时有用。)

st_rdev字段描述这个文件(inode)本身代表的设备。

st_size字段给出文件字节尺寸(如果它是一个普通文件或符号链接)。对于符号链接而言是它所有包含路径名长度,不包括结尾的空字符。

st_blocks字段指明文件已经分配数据块的个数,数据块以 512字节为单位。(这可能小于st_size/512,当文件有空洞时。)

st_blksize给出对于高效文件系统 I/O操作的优先块尺寸。(数据以小尺寸块写入文件时可能导致低效的读-更改-覆盖操作。)

不是所有的 Linux文件系统实现了所有的时间域。一些文件系统允许挂载时不去访问文件或目录且不会导致st_atime 字段更新。(参考 mount() noatimenodiratimerelatime,以及mount()中相关的信息。)此外,如果文件以 O_NOATIME标志打开,st_atime不会被更新。

st_atime字段在文件访问时更改,比如,execve()mknod()pipe()utime()read()(多于零个字节)

st_mtime 在文件更改时更新,比如,mknod()truncate()utime() write()(多于零个字节)。再者,一个目录的st_mtime 在这个目录里创建或删除文件时更新。st_mtime在更改所有者、组、硬链接个数或权限模式时不会更新。

st_ctime字段在写入或设置结点(inode)信息(如所有者、组、链接数、权限等等)时会更改。

下面 POSIX宏用于使用 st_mode字段测试文件类型:

S_ISREG(m)

它是普通文件吗?

S_ISDIR(m)

目录吗?

S_ISCHR(m)

字符设备?

S_ISBLK(m)

块设备?

S_ISFIFO(m)

FIFO(命名管道)

S_ISLNK(m)

符号链接?(不在 POSIX.1-1996)

S_ISSOCK(m)

套接口?(不在 POSIX.1-1996)

下面标志为st_mode 域定义:

S_IFMT

0170000

文件类型位域掩码

S_IFSOCK

0140000

套接口

S_IFLNK

0120000

符号链接

S_IFREG

0100000

普通文件

S_IFBLK

0060000

块设备

S_IFDIR

0040000

目录

S_IFCHR

0020000

字符设备

S_IFIFO

0010000

FIFO

S_ISUID

0004000

设置 UID

S_ISGID

0002000

设置 组ID 位 (看下面)

S_ISVTX

0001000

粘滞位(看下面)

S_IRWXU

00700

文件所有者权限掩码

S_IRUSR

00400

所有者有读权限

S_IWUSR

00200

所有者有写权限

S_IXUSR

00100

所有者有执行权限

S_IRWXG

00070

组权限掩码

S_IRGRP

00040

组有读权限

S_IWGRP

00020

组有写权限

S_IXGRP

00010

组有执行权限

S_IRWXO

00007

其他用户权限掩码(不在组内)

S_IROTH

00004

其他有读权限

S_IWOTH

00002

其他有写权限

S_IXOTH

00001

其他有执行权限

设置组IDS_ISGID)有多个特殊用处。对于一个目录而言,它指明 BSD 语义应用到这个目录;创建的文件继承其父目录的组ID,而不是来自创建进程的有效组ID,并且创建的目录同时也会获得S_SIGID 位设置。对于一个没有组执行权限位(S_IXGRP)文件而言,设置组ID位用于指明托管文件/记录锁。

在目录上的粘滞位(S_ISVTX)表示目录里的文件只有其所有者,目录所有者,和特权进程,可以对其进行重命名或删除。

 

 

0 0