名前


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(7) も参照すること)。 または buf が NULL で、かつプロセスにタイムスタンプの変更許可がない (上記を参照すること)。
ENOENT filename が存在しない。
EPERM buf が NULL でなく、かつプロセスにタイムスタンプの変更許可がない。
EROFS path が読み込み専用のファイルシステム上にある。

準拠


utime(): SVr4, POSIX.1-2001. utimes(): 4.3BSD

注意


Linux では、不変 (immutable) ファイルのタイムスタンプを変更したり、 追加専用 (append-only) のファイルに現在時刻以外のタイムスタンプを 設定したりすることは、許可されていない。

libc4 と libc5 では、 utimes() は単に utime() のラッパー (wrapper) である。 そのため秒以下を指定することはできない。

POSIX.1-2001 では utimes() は過去の名残であるとされているが、不思議なことに utimes() は utime() よりも高機能である。

バグ


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

関連項目


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

openSUSE Logo

コンテンツ