st_ctimeを変更する方法

解決済みの質問

st_ctimeを変更する方法

Linux Cプログラミングを行っておりますが解決できない問題がありますので質問させていただきます。
ファイルの状態変更日時st_ctime(statにて取得できる)を変更したいのですが方法がわかりません。

ファイルのst_ctimeをプログラム中から変更することは可能でしょうか?
もし、変更可能ならばその方法を教えていただけますでしょうか?

環境は、Redhat7.3です。
よろしくお願いいたします。

投稿日時 - 2003-05-01 08:53:51

連想キーワード:

QNo.536418

困ってます

質問者が選んだベストアンサー

難しいようですね.

samba-jp ML の
http://www.samba.gr.jp/ml/samba-jp/htdocs/20000620/6533.html
から始まるスレッドが参考になるかも.特に
http://www.samba.gr.jp/ml/samba-jp/htdocs/20000620/6549.html
とか.

結局,ここでは st_ctime を変更する方法は無いとだけ言われていますが,まあ,全く手段が無いはずはないわけで …

全く自信は無いですが,カーネルのソースツリーを検索すると勉強になるかもとかいう話しなのかも.

$ cd /usr/src/linux
$ grep -r st_ctime *

ディレクトリ fs/ 以下がそれっぽいですね.
$ cd fs
$ grep st_ctime *
stat.c: tmp.st_ctime = inode->i_ctime;
stat.c: tmp.st_ctime = inode->i_ctime;
stat.c: tmp.st_ctime = inode->i_ctime;

$ cd ext2
$ grep i_ctime *
dir.c: dir->i_mtime = dir->i_ctime = CURRENT_TIME;
dir.c: dir->i_mtime = dir->i_ctime = CURRENT_TIME;
dir.c: inode->i_ctime = inode->i_mtime = CURRENT_TIME;
ialloc.c: inode->i_mtime = inode->i_atime = inode->i_ctime = CURRENT_TIME;
inode.c: inode->i_ctime = CURRENT_TIME;
inode.c: inode->i_mtime = inode->i_ctime = CURRENT_TIME;
inode.c: inode->i_ctime = le32_to_cpu(raw_inode->i_ctime);
inode.c: raw_inode->i_ctime = cpu_to_le32(inode->i_ctime);
ioctl.c: inode->i_ctime = CURRENT_TIME;
ioctl.c: inode->i_ctime = CURRENT_TIME;
namei.c: inode->i_ctime = CURRENT_TIME;
namei.c: inode->i_ctime = dir->i_ctime;
namei.c: new_inode->i_ctime = CURRENT_TIME;

あとは,utime(2) のソースを読んでみるとか.

投稿日時 - 2003-05-02 21:21:17

お礼

ご回答ありがとうございました。
更新日付やアクセス日付が簡単に変えられるので、属性変更日付も簡単に変更できると思っていたんですが・・・
ご回答いただいた方法は、私のスキルではちょっとつらいので属性変更日付を使用しない方法を考えようと思います。
米?のサイトにこんな方法がありました。
1.マシンの日付を変更したい属性変更日付に更新する。
2.属性変更日が更新されるよな操作をする。(utime等)
3.マシンの日付を元に戻す。
コードは書いて実験は成功したのですが、途中で異常終了した場合等を考慮すると、危ないので使用することは止めました。

投稿日時 - 2003-05-09 08:45:31

ANo.1

1人が「このQ&Aが役に立った」と投票しています

あわせてチェックしたい
  • 日時を取得するプログラムは!? ...
  • Redhat ...
  • [Redhat Linux]sarの出力結果について ...
PR
【募集】今「ありがとう」を伝えたい相手は?[ 詳細 ]

OKWaveのオススメ

教えて弁護士さん!

お金の悩みQ&A特集はこちら