Changing File Times

When a file is created, there are three timestamps associated with the file as shown in the stat structure earlier. These are the creation time, the time of last modification, and the time that the file was last accessed.

On occasion it is useful to change the access and modification times. One particular use is in a programming environment where a programmer wishes to force re-compilation of a module. The usual way to achieve this is to run the touch command on the file and then recompile. For example:

$ ls -l hello*
-rwxr-xr-x     1 spate    fcf          13397 Mar 30 11:53 hello*
-rw-r--r-      1 spate    fcf             31 Mar 30 11:52 hello.c
$ make hello
make: ‘hello’ is up to date.
$ touch hello.c
$ ls -l hello.c
-rw-r--r-      1 spate    fcf             31 Mar 30 11:55 hello.c
$ make hello
cc     hello.c     -o hello
$

The system calls utime() and utimes() can be used to change both the access and modification times. In some versions of UNIX, utimes() is simply implemented by calling utime().

#include <sys/types.h>
#include <utime.h>

int utime(const char *filename, struct utimbuf *buf);

#include <sys/time.h>

int utimes(char *filename, struct timeval *tvp);

struct utimbuf {
    time_t  actime;    /* access time */
    time_t  modtime;    /* modification time */
};

struct timeval {
    long    tv_sec;    /* seconds */
    long    tv_usec;   /* microseconds */
};

By running strace, truss etc., it is possible to see how a call to touch maps onto the utime() system call as follows:

$ strace touch myfile 2>&1 | grep utime
utime(“myfile”, NULL)                            = 0

Get UNIX Filesystems: Evolution, Design, and Implementation now with the O’Reilly learning platform.

O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.