在前面的struct stat结构体中的参数基本介绍完毕,还有最后一个属性,是文件的时间属性,时间属性都包括如下内容:
| 结构体字段 | 说明 |
| struct timespec st_atim; | 文件最后访问时间 |
| struct timespec st_mtim; | 文件内容最后修改时间 |
| struct timespec st_ctim; | 文件状态最后状态改变时间 |
文件最后访问时间:顾名思义是指最后一次读取文件内容的时间,如使用read函数读取文件的内容之后,此项时间就会发生变化。
文件内容最后修改时间:指文件内容发生改变,如使用write函数向文件中写入数据,变会发生变化。
文件状态最后被修改时间:状态更改时指文件的inode节点最后一次被修改的时间。
那什么情况下inode节点话发生变化呢?下面就简单介绍下。
1.文件内容被修改:通过函数对文件读写时,会更新inode节点的修改时间和状态更改时间。如函数fwirte()或者wirte()。
2.文件属性修改:修改文件的权限、所有者或者文件名,就会更新inode节点的状态更改时间。如前面提到的chmod()、 chown()、 rename()函数。
3.创建或删除文件:创建新的文件或者删除文件也会影响inode节点。如open()、creat()、unlink()、remove()。
那么如何修改文件的时间属性呢?下面就来介绍4个修改时间属性的函数:
修改时间属性的函数有utime()、utimes()、futimens()、utimensat()等函数,下表中为函数的基本区别:
| 函数 | 功能 | 时间精度 |
| utime() | 设置文件的访问时间和修改时间 | 秒级别 |
| utimes() | 设置文件的访问时间和修改时间 | 微秒级别 |
| utimensat() | 设置文件的访问时间和修改时间 | 纳秒级别 |
| futimens() | 设置已打开文件的访问时间和修改时间 | 纳秒级别 |
上面介绍了修改时间属性函数的基本区别,需要注意的是,不是所有的用户都可以修改文件的时间属性,只有超级用户和有效用户ID和文件用户ID相匹配的进程才会拥有修改权限。
176