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);
}


関連ページ