请注意,在模式/proc
下打开文件后写入文件时,修改时间戳不会更改r+
(但如果在w
模式下打开则更改)。它以这种方式工作有什么特殊原因吗?
长话短说
使用 thinkfan 解决问题时(为什么thinkfan启动和结束一次后,风扇却反复启动?),注意到/proc/acpi/ibm/fan
修改时间没有因thinkfan
操作而改变,我怀疑程序使用它。但我自己构建修改后的代码确认它会打开它,((fan = fopen(IBM_FAN, "r+")) == NULL)
.我在c
应用程序中使用 打开文件w
,当我将代码更改为使用r+
修改时间戳打开时,也停止更改。
只是做echo level 1 | sudo tee /proc/acpi/ibm/fan
还更新文件修改时间戳。我读了https://stackoverflow.com/questions/21113919/difference- Between-r-and-w-in-fopenr+
和的区别w
是w
截断文件。以防万一检查ext4
写入使用r+
更新修改时间戳打开的文件。
根据评论添加:
$ sudo cat /proc/acpi/ibm/fan
status: disabled
speed: 0
level: 0
commands: level <level> (<level> is 0-7, auto, disengaged, full-speed)
commands: enable, disable
commands: watchdog <timeout> (<timeout> is 0 (off), 1-120 (seconds))
$ sudo strace stopfan // r+
execve("/usr/local/bin/stopfan", ["stopfan"], 0x7ffdf26fdc50 /* 25 vars */) = 0
openat(AT_FDCWD, "/proc/acpi/ibm/fan", O_RDWR) = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=0, ...}) = 0
write(3, "level 0\n", 8) = 8
close(3) = 0
exit_group(0) = ?
+++ exited with 0 +++
$ sudo strace ./stopfan // w+
execve("./stopfan", ["./stopfan"], 0x7ffca68b2d40 /* 25 vars */) = 0
openat(AT_FDCWD, "/proc/acpi/ibm/fan", O_RDWR|O_CREAT|O_TRUNC, 0666) = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=0, ...}) = 0
write(3, "level 0\n", 8) = 8
close(3) = 0
exit_group(0) = ?
+++ exited with 0 +++
答案1
我不知道这是故意的还是错误(如果这里没有人解释的话,在内核邮件列表上询问可能有用)。
但我可以确认这似乎是/proc
.我试过了/proc/sys/net/ipv4/ip_forward
。echo 0 >>ip_forward
确实将值更改为1
to0
但不更改 mtime。echo 1 >ip_forward
确实改变了时间。