Perl で utime できない問題について

perl の utime 関数でファイルのタイムスタンプを変更しようとすると、ファイルに対する書き込み権限があるのに、"Operation not permitted" というエラーがでて、処理ができないことがあります。
このナゾ(?)について、解説します。

utime の書式

utime 関数の書式は、例えば以下のようになります。

$now = time;
utime($now, $now, $file1, $file2);

第1引数=アクセス時刻、第2引数=更新時刻、残りは、タイムスタンプを変更する対象ファイルパスを指定します。

これは、コマンドプロンプトから実行する

% touch file1 file2

と同等です…ただし、ファイルのオーナーである限りは。

touch の仕様

touch はファイルのタイムスタンプを変更するコマンドです。

% touch file1

とすると、file1 のタイムスタンプが、touchを実行した時刻に変更されます。(指定されたファイルが無ければ作成されます。)

この書式、つまり、タイムスタンプを実行時現在に変更する場合、ファイルの書き込み権限があれば、ファイルのオーナーでなくても touch を実行できます。

ところが、更新時刻をオプション(-t や -r)で指定する場合、その処理は、ファイルのオーナにしか許可されていません。

man touch にはこれに関する仕様が何も書いていないのですが、この現象は、FreeBSD と Linux で体験しました。(何か他の設定が絡んでいるのかも知れませんが…。)