C言語システムコール-utime
utimeシステムコール
概要
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);
}