UNIX环境编程学习笔记(11)——文件I/O之文件时间以及 utime 函数
lienhua34
2014-09-16
1 文件的时间
每个文件都有三个时间字段,如表 1 所示。
| 说明 | 字段 |
| st_atime | 文件数据的最后访问时间 |
| st_mtime | 文件数据的最后修改时间 |
| st_ctime | i 节点状态的最后更改时间 |
最后修改时间是文件内容最后一次被修改的时间。更改状态时间是该文件的 i 节点最后一次被修改的时间。
2 utime 函数
utime 函数提供了对文件最后访问时间和最后修改时间的更改功能。
#include <utime.h>
int utime(const char *pathname, const struct utimbuf *times);
返回值:若成功则返回0,若出错则返回-1.
其中 utimbuf 结构的定义如下,
struct utimbuf {
time_t actime; /* access time */
time_t modtime; /* modification time */
};
此结构中的两个时间值是日历时间,即自 1970 年 1 月 1 日 00:00:00 以来国际标准时间所经过的秒数。
此函数的操作以及所需要的权限取决于 times 参数是否是 NULL。
• 如果 times 参数是一个空指针,则访问时间和修改时间两者都被设置为当前时间。所需要的权限:进程的有效用户 ID 必须等于该文件的所有者 ID,或者进程对该文件必须具有写权限。
• 如果 times 是非空指针,则访问时间和修改时间被设置为 times 所指向的结构中的值。所需要的权限:进程的有效用户 ID 必须等于该文件的所有者 ID,或者进程必须是一个超级用户进程。
例子:
下面程序将文件 foo 的访问时间和修改时间都更改为当前时间。对于文件 bar,则先使用 stat 函数获取该文件的访问时间和修改时间,然后使用O_TRUNC 选项调用 open 函数打开文件 bar(会导致该文件的访问时间和修改时间都发生变更),最后将该文件的这两个时间还原为调用 stat 函数时的值。
#include <stdlib.h>
#include <stdio.h>
#include <fcntl.h>
#include <utime.h>
#include <errno.h>
#include <string.h>
int
main(void)
{
int i, fd;
struct stat statbuf;
struct utimbuf timebuf;
if (utime("foo", NULL) < ) {
printf("utime foo error: %s\n", strerror(errno));
exit(-);
}
if (stat("bar", &statbuf) < ) {
printf("stat error: %s\n", strerror(errno));
exit(-);
}
if ((fd = open("bar", O_RDWR | O_TRUNC)) < ) {
printf("open error: %s\n", strerror(errno));
exit(-);
}
close(fd);
timebuf.actime = statbuf.st_atime;
timebuf.modtime = statbuf.st_mtime;
if (utime("bar", &timebuf) < ) {
printf("utime bar error: %s\n", strerror(errno));
exit(-);
}
exit();
}
编译该程序,生成文件 utimedemo,然后运行该文件,
lienhua34:demo$ gcc -o utimedemo utimedemo.c
lienhua34:demo$ ls -l foo bar 查看文件最后修改时间
-rw-r--r-- lienhua34 lienhua34 9月 : bar
-rw-rwSr-- lienhua34 lienhua34 9月 : foo
lienhua34:demo$ ls -lu foo bar 查看文件最后访问时间
-rw-r--r-- lienhua34 lienhua34 9月 : bar
-rw-rwSr-- lienhua34 lienhua34 9月 : foo
lienhua34:demo$ date
2014年 09月 16日 星期二 :: CST
lienhua34:demo$ ./utimedemo
lienhua34:demo$ ls -l foo bar 查看文件最后修改时间-rw-r--r-- lienhua34 lienhua34 9月 : bar
-rw-rwSr-- lienhua34 lienhua34 9月 : foo
lienhua34:demo$ ls -lu foo bar 查看文件最后访问时间-rw-r--r-- lienhua34 lienhua34 9月 : bar
-rw-rwSr-- lienhua34 lienhua34 9月 : foo
ls 命令按这个三个时间值中的一个排序进行显示。系统默认(用 -l 或-t 选项调用时),它按文件的最后修改时间的先后排序显示。-u 选项使其用最后访问时间进行排序,-c 选项则使其用更改状态时间进行排序。
(done)
UNIX环境编程学习笔记(11)——文件I/O之文件时间以及 utime 函数的更多相关文章
- UNIX环境编程学习笔记(13)——文件I/O之标准I/O流
lienhua342014-09-29 1 标准 I/O 流 之前学习的都是不带缓冲的 I/O 操作函数,直接针对文件描述符的,每调用一次函数可能都会触发一次系统调用,单次调用可能比较快捷.但是,对于 ...
- UNIX环境编程学习笔记(12)——文件I/O之目录操作
lienhua342014-09-18 1 引言 在 UNIX 系统中,目录是一种特殊的文件类型.我们可以使用 open 函数来打开目录,获取文件描述符,然后调用 stat 函数来获取目录的属性信息, ...
- UNIX环境编程学习笔记(10)——文件I/O之硬链接和符号链接
lienhua342014-09-15 1 文件系统数据结构 UNIX 文件系统通过 i 节点来存储文件的信息.如图 1 所示为一个磁盘柱面上的 i 节点和数据块示意图.其中 i 节点是一个固定长度的 ...
- UNIX环境编程学习笔记(9)——文件I/O之文件访问权限的屏蔽和更改
lienhua342014-09-10 1 文件访问权限 在文件访问权限和进程访问控制中,我们已经讲述过文件访问权限位,为了方便,我们重新列在下面, 表 1: 文件的 9 个访问权限位 st_mod ...
- UNIX环境编程学习笔记(8)——文件I/O之校验当前登录用户对文件的访问权限
lienhua342014-09-03 通过前面一篇随笔(文件访问权限与进程访问控制),我们知道内核校验文件的访问权限使用的是进程的有效用户 ID 和有效组 ID.但有时我们需要知道当前登录用户对某个 ...
- UNIX环境编程学习笔记(7)——文件I/O之文件访问权限与进程访问控制
lienhua342014-09-02 1 文件的设置用户 ID位 和设置组 ID位 与进程相关联的 ID 如下表所示, 表 1: 与进程相关联的用户 ID 和组 ID 实际用户 ID 我们实际上是谁 ...
- UNIX环境编程学习笔记(6)——文件I/O之判断文件类型
lienhua342014-09-01 1 文件类型 我们平时最常接触的文件类型有普通文件(regular file)和目录(di-rectory file),但是 UNIX 系统提供了多种文件类型: ...
- UNIX环境编程学习笔记(3)——文件I/O之内核 I/O 数据结构
lienhua342014-08-27 内核使用三种数据结构表示打开的文件,分别是文件描述符表.文件表和 V 节点表. (1) 每个进程在进程表中都有一个记录项,记录项中包含有一张打开文件描述符表,每 ...
- UNIX环境编程学习笔记(2)——文件I/O之不带缓冲的 I/O
lienhua342014-08-25 1 文件描述符 对于内核而言,所有打开的文件都通过文件描述符引用.文件描述符是一个非负整数.当打开一个现有文件或创建一个新文件时,内核向进程返回一个文件描述符. ...
随机推荐
- 基于jquery地图特效全国网点查看代码
基于jquery地图特效全国网点查看代码.这是一款简单实用的jQuery地图特效,主要知识点是jquery和css实现了中图地图,提示层效果.效果图如下: 在线预览 源码下载 实现的代码. htm ...
- Thinkphp动态切换主题
'DEFAULT_THEME' => '2014', 'TMPL_DETECT_THEME' => true, // 自动侦测模板主题 'THEME_LIST' => '2012,2 ...
- 大型机、小型机、x86服务器的区别
原文:http://servers.pconline.com.cn/gc/1202/2679853_1.html 大型机.小型机.x86服务器的区别 首先来讲x86服务器,与平常人们所接触的台式机笔记 ...
- QButton
Button.h #pragma once // QButton class QButton : public CButton { DECLARE_DYNAMIC(QButton) // Constr ...
- spring boot 使用拦截器 无法注入 配置值 、bean问题
参考:https://www.cnblogs.com/SimonHu1993/p/8360701.html 一定要将 拦截器组件 交给spring容器进行管理,这样才能注入配置值,或者注入bean: ...
- Chrome 主页被篡改
尝试恢复设置.重装chrome.改注册表均无果.最后意外发现解决方法无比简单:删掉桌面上的chrome图标,打开安装文件夹找到chrome.exe,随便改成什么名字.exe,比如baiduwcnm,重 ...
- Java设计模式(11)外观模式(Facade模式)
外观模式(Facade)的定义:为子系统中的一组接口提供一个一致的界面. Facade一个典型应用就是数据库JDBC的应用,如下例对数据库的操作: public class DBCompare { C ...
- USB学习笔记连载(十二):USB描述符
USB设备是端口,接口,配置的集合,USB协议是以各种USB描述符来表征USB设备的功能.计算机通过这些描述符来获得USB设备的功能. USB描述符包括: USB标准设备描述符,USB集线器描述符.H ...
- ADB 设置远程调试
Version:0.9 StartHTML:-1 EndHTML:-1 StartFragment:00000099 EndFragment:00016657 相信很多人在android 开发调试的时 ...
- struts2系列(一):struts2入门(struts2的产生、struts2的工作流程、搭建struts2开发环境)
一. struts2的产生 struts1的缺点: 1. ActionForm过多,而且这个ActionForm在很大程度上又和VO(POJO)重复 ...