open(), mmap(), sendfile() vs. the file's access time

Erik Trulsson ertr1013 at student.uu.se
Thu Nov 18 05:45:44 PST 2004


On Wed, Nov 17, 2004 at 02:07:11PM -0500, Mikhail Teterin wrote:
> Hello!
> 
> It appears, only read() modifies a file's atime. Otherwise, a file can be 
> open()-ed and subsequently _accessed_ through mmap or sendfile()-ed away 
> without atime being changed. Does not seem right...
> 
> Should open() update atime? My first reaction would be yes, but  on Linux and 
> Solaris the behaviour is the same (try attached program).
> 
> Should sendfile()? What about mmap() -- there are some hairy usages?..

I don't know if the current behaviour is "right", but it is certainly
consistent with the documentation. From the manpage for stat(2):


  The time-related fields of struct stat are as follows:

  st_atime     Time when file data last accessed.  Changed by the
               mknod(2), utimes(2) and read(2) system calls.

  st_mtime     Time when file data last modified.  Changed by the
               mknod(2), utimes(2) and write(2) system calls.

  st_ctime     Time when file status was last changed (inode data
               modification).  Changed by the chmod(2), chown(2),
               link(2), mknod(2), rename(2), unlink(2), utimes(2) and
               write(2) system calls.


The Solaris stat(2) manpage says:

  st_atime
        Time when file data was last accessed. Changed by  the
        following   functions:   creat(),   mknod(),   pipe(),
        utime(2), and read(2).

  st_mtime
        Time when data was last modified. Changed by the  fol-
        lowing  functions:  creat(), mknod(), pipe(), utime(),
        and write(2).

  st_ctime
        Time when file status was last changed. Changed by the
        following   functions:   chmod(),   chown(),  creat(),
        link(2),  mknod(),  pipe(),  unlink(2),  utime(),  and
        write().


And on Linux stat(2) says:

   The field st_atime is changed by file accesses,  e.g.  by execve(2),
   mknod(2), pipe(2), utime(2) and read(2) (of more than zero bytes).
   Other routines, like mmap(2), may or may not update st_atime.

   The  field  st_mtime  is  changed  by  file  modifications, e.g. by
   mknod(2), truncate(2), utime(2) and write(2) (of more than zero
   bytes).  Moreover, st_mtime of a directory is changed by the
   creation or deletion of files in that directory.  The st_mtime field
   is not changed for changes in owner, group, hard link count, or
   mode.

   The field st_ctime is changed by writing or by setting inode
   information (i.e., owner, group, link count, mode, etc.).



It seems that one should definitely not depend on atime being changed
by mmap() or sendfile().



-- 
<Insert your favourite quote here.>
Erik Trulsson
ertr1013 at student.uu.se


More information about the freebsd-current mailing list