I found a way. I used GNU stat (stat (GNU coreutils) 8.19) to look at "Access", "Modify" and "Change" timestamps of a file.
I could update the "Change" time by doing a chmod u+x on the file. "Modify" and "Access" timestamps remained the same.
I could update "Access" file by doing a cat on it. "Modify" and "Change" timestamps remained the same.
I wrote a small C program that just does an open(filename, O_WRONLY);, writes a single byte to the file descriptor, and then a close(filedes); on the resulting file descriptor. stat showed no change on the subject file's "Access" timestamp, but "Modify" and "Change" timestamps got updated.
This was all under Linux 3.5.4, a fairly recently update Arch Linux laptop, on an Ext4 filesystem.
The small C program:
#include <stdio.h>
#include <errno.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
int
main(int ac, char **av)
{
int fd = open(av[1], O_WRONLY);
if (fd >= 0)
{
char buf[12];
write(fd, buf, 1);
if (close(fd) < 0)
fprintf(stderr, "Problem closing file: %s\n",
strerror(errno));
} else {
fprintf(stderr, "Problem opening \"%s\": %s\n",
av[1], strerror(errno));
}
return 0;
}