utimeはファイルのタイムスタンプ(修正時刻とアクセス時刻)を変更します。
touchコマンド内部で利用されています。
指定時刻はマイクロ秒単位まで指定できますが、ファイルシステムが1秒未満のタイムスタンプに対応している必要があります。
utimeの他にutimesシステムコールがあります。
utimeはSystem V系のシステムコールであり、BSD系システムコールではutimesとなります。
OSによって、utimeとutimesのどちらかがシステムコールとなっており、他方はCライブラリ関数として実装されているケースがあります。
#include <stdio.h> #include <string.h> #include <stdlib.h> #include <errno.h> #include <time.h> #ifdef BSD #include <sys/time.h> #else #include <utime.h> #include <sys/types.h> #endif /*! * @brief ファイルのタイムスタンプを更新する。 * @param[in] filepath ファイルパス名 * @return 0:success/-1:failure */ static int update_timestamp(char *filepath) { int rc = 0; struct tm tv = {0}; #ifdef BSD struct timeval times[2]; #else struct utimbuf buf = {0}; #endif tv.tm_sec = 0; tv.tm_min = 0; tv.tm_hour = 0; tv.tm_mday = 0; tv.tm_mon = 0; /* 1月が0 */ tv.tm_year = 0; /* 1900年が0 */ tv.tm_isdst = 0; /* 夏時間 */ #ifdef BSD times[0].tv_sec = mktime(&tv); times[0].tv_usec = 0; times[1] = times[0]; rc = utimes(filepath, times); #else buf.actime = mktime(&tv); buf.modtime = buf.actime; rc = utime(filepath, &buf); #endif if(rc < 0){ printf("Error: utime() %s: %s\n", strerror(errno), filepath); return(-1); } return(0); } int main(int argc, char *argv[]) { int rc = 0; if(argc != 2){ fprintf(stderr, "Usage: %s <path>\n", argv[0]); exit(EXIT_FAILURE); } rc = update_timestamp(argv[1]); if(rc != 0) exit(EXIT_FAILURE); exit(EXIT_SUCCESS); }