[samba-jp:20697] Re: ファイル更新時刻の精度
EMOTO Masahiko
emo @ nifs.ac.jp
2009年 5月 23日 (土) 11:35:23 JST
どうもわざわざありがとうございます。
samba のソースコードを取得したのですが、ちょっと調べるのは
大変そうです。
Linux (POSIX) のシステムコールで utimes というのがあって、
おそらくこれを使って変更しているのではないかと思いますが、
これだと引数として timeval 型をとっており、その関係上ミリ秒
までしかセットできないようです。
Linux ではカーネル 2.6.22 から utimenstat というシステムコールが
追加され、これを使うとナノ秒単位でタイムスタンプをセットできる
ようですが。
> UTIME(2) Linux Programmer’s Manual UTIME(2)
>
> 名前
> utime, utimes - ファイルの最終アクセス時刻と修正時刻を変更する
>
> 書式
> #include <sys/types.h>
> #include <utime.h>
>
> int utime(const char *filename, const struct utimbuf *times);
>
> #include <sys/time.h>
>
> int utimes(const char *filename, const struct timeval times[2]);
>
> 説明
> utime() システムコールは filename で示される inode のアクセス時刻と修正
> 時刻を times 中の actime と modtime にそれぞれ変更する。
>
> times が NULL の場合、ファイルのアクセス時刻と修正時刻は現在の時刻に 設
> 定される。
>
> タ イムスタンプの変更は以下のいずれかの場合に許可される。プロセスに適切
> な特権がある場合、実効 (effective) ユーザ ID がファイルのユーザ ID と等
> しい場合、 times が NULL かつ、プロセスがファイルへの書き込み許可を持っ
> ている場合。
>
> 構造体 utimbuf は以下に示すようになっている。
>
> struct utimbuf {
> time_t actime; /* アクセス時刻 */
> time_t modtime; /* 修正時刻 */
> };
>
> utime() システムコールは 1 秒の分解能でタイムスタンプを指定することがで
> きる。
> >
> utimes() は utime() と同様であるが、 times 引き数が構造体ではなく配列を
> 参照する。この配列の要素は timeval 構造体で、タイムスタンプの指定 を 1
> マイクロ秒の分解能で行うことができる。構造体 timeval は以下に示す通りで
> ある。
>
> struct timeval {
> long tv_sec; /* 秒 */
> long tv_usec; /* マイクロ秒 */
> };
>
> times[0] は新しいアクセス時刻を、 times[1] は新しい修正時刻を規定する。
> times が NULL の場合、 utime() 同様、ファイルのアクセス時刻と修正時刻は
> 現在の時刻に設定される。
samba-jp メーリングリストの案内