kazmax - Linux で自宅サーバー

utime - システムコールの説明 - Linux コマンド集 一覧表

  1. 名前
  2. 書式
  3. 説明
  4. 返り値
  5. エラー
  6. 注意
  7. バグ
  8. 準拠
  9. 関連項目

名前

utime, utimes - inode のアクセス時刻/修正時刻を変更する

書式

#include <sys/types.h>

#include <utime.h>
int utime(const char *filename, const struct utimbuf *buf);
#include <sys/time.h>
int utimes(const char *filename, const struct timeval times[2]);

説明

utime ()は filename で示される inode のアクセス時刻と修正時刻を buf 中の actimemodtime にそれぞれ変更する。
bufNULL の場合、ファイルのアクセス時刻と修正時刻は現在の時刻に設定される。
タイムスタンプの変更は以下の場合に許可される: プロセスに適切な特権がある (Linux では CAP_FOWNER ケーパビリティ (capability) がある)。 または実効 (effective) ユーザ ID が、ファイルのユーザ ID と等しい。 または buf が NULL で、かつプロセスがファイルへの書き込み許可を持っている。
構造体 utimbuf は以下に示すようになっている。

struct utimbuf {
    time_t actime;       /* アクセス時刻 */
    time_t modtime;      /* 修正時刻 */
};


関数 utime ()は 1 秒の分解能でタイムスタンプを指定することができる。 関数 utimes ()は utime ()と同様であるが、1 マイクロ秒の分解能でタイムスタンプを指定することができる。 ここで、 times [0]はアクセス時刻を参照し、 times [1]は修正時刻を参照する。
構造体 timeval は以下に示す通りである。

struct timeval {
    long tv_sec;        /* 秒 */
    long tv_usec;       /* マイクロ秒 */
};

返り値

成功した場合 0 が返る。失敗した場合 -1 が返り、 errno がエラーの内容に従って設定される。

エラー

EACCES
path を構成する何れかのディレクトリに検索許可がない ( path_resolution (2)も参照すること)。 または buf が NULL で、かつプロセスにタイムスタンプの変更許可がない (上記を参照すること)。
ENOENT
filename が存在しない。
EPERM
buf が NULL でなく、かつプロセスにタイムスタンプの変更許可がない。
EROFS
path が読み込み専用のファイルシステム上にある。

注意

Linux では、不変 (immutable) ファイルのタイムスタンプを変更したり、 追加専用 (append-only) のファイルに現在時刻以外のタイムスタンプを 設定したりすることは、許可されていない。
libc4 と libc5 では、 utimes ()は単に utime ()のラッパー (wrapper) である。 そのため秒以下を指定することはできない。
POSIX.1-2001 では utimes ()は過去の名残であるとされているが、不思議なことに utimes ()は utime ()よりも高機能である。

バグ

Linux は EACCES と EPERM エラーの区別に注意を払っていない。 また POSIX.1-2001 では utimes ()のエラーの記述にバグがある。

準拠

utime ():
utimes ():4.3BSD

関連項目

  chattr (1),  futimesat (2),  stat (2),   futimes (3)