Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1478749
  • 博文数量: 842
  • 博客积分: 12411
  • 博客等级: 上将
  • 技术积分: 5772
  • 用 户 组: 普通用户
  • 注册时间: 2011-06-14 14:43
文章分类

全部博文(842)

文章存档

2013年(157)

2012年(685)

分类: 系统运维

2012-05-14 17:30:23



文件的访问时间和修改时间可以用utime函数改变。



  1. #include <utime.h>

  2. int utime(const char *pathname, const struct utimebuf *times);

  3. 成功返回0,失败返回-1。


这个函数使用的结构体为:


  1. struct utimbuf {
  2.   time_t actime; /* 访问时间 */
  3.   time_t modtime; /* 修改时间 */

  4. };


在这个结构体里的两个时间值是日期时间,正如1.10节描述的那样,是从Epoch开始的秒数。


这个函数的操作和执行它所需的权限,取决于时间参数时否为NULL。


1、如果times为null指针,访问时间和修改时间都被设为当前时间。要这样做的话,进程的有效有用ID必须和文件的属主ID相同,或者进程必须有这个文件的写权限。


2、如果times是一个非空指针,访问时间和修改时间设为times指向的结构体的值。在这种情况下,进程的有效用户ID必须和文件的属主ID相同,或者进程必须是一个超级用户进程。仅有文件的写权限是不够的。


注意我们不能为状态改变时间指定一个值,st_ctime--i-node最近修改的值--因为这个域utime函数被调用时会被自动更新。


UNIX系统的一些实现,touch命令使用了这个函数。还有,标准存档程序,tar和cpio,选择性地调用utime来把文件的时间设为文件被存档的时间。


下面的程序使用O_TRUNC选项的open函数把文件裁切成0长度,但不改变它们的访问或修改时间。要这样做,程序首先通过stat函数得到时间,接着裁切文件,然后用utime函数重设时间:



  1. #include <fcntl.h>
  2. #include <utime.h>

  3. int
  4. main(int argc, char *argv[])
  5. {
  6.     int i, fd;
  7.     struct stat statbuf;
  8.     struct utimbuf timebuf;

  9.     for (i = 1; i < argc; i++) {
  10.         if (stat(argv[i], &statbuf) < 0) {
  11.             printf("%s: stat error\n", argv[i]);
  12.             continue;
  13.         }
  14.         if ((fd = open(argv[i], O_RDWR | O_TRUNC)) < 0) {
  15.             printf("%s: open error\n", argv[i]);
  16.             continue;
  17.         }
  18.         close(fd);
  19.         timebuf.actime = statbuf.st_atime;
  20.         timebuf.modtime = statbuf.st_mtime;
  21.         if (utime(argv[i], &timebuf) < 0) {
  22.             printf("%s: utime error\n", argv[i]);
  23.             continue;
  24.         }
  25.     }
  26.     exit(0);
  27. }



$ ls -l tmp
-rw-rw-r-- 1 tommy tommy 896467 2012-02-22 20:35 tmp
$ ls -lu tmp
-rw-rw-r-- 1 tommy tommy 896467 2012-02-22 20:29 tmp
$ ls -lc tmp
-rw-rw-r-- 1 tommy tommy 896467 2012-02-22 20:35 tmp
$ date
2012年 02月 22日 星期三 20:37:29 CST
$ ./a.out tmp
$ ls -l tmp
-rw-rw-r-- 1 tommy tommy 0 2012-02-22 20:35 tmp
$ ls -lu tmp
-rw-rw-r-- 1 tommy tommy 0 2012-02-22 20:29 tmp
$ ls -lc tmp
-rw-rw-r-- 1 tommy tommy 0 2012-02-22 20:37 tmp

正如我们预期的一样,最后修改时间和最后访问时间都没有改变。然而,状态改变时间改成了程序运行的时间。


阅读(469) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~