写入用 r+ 打开的 procfs 文件不会更改修改时间戳(与用 w 打开相反) - 有什么特殊原因吗?

写入用 r+ 打开的 procfs 文件不会更改修改时间戳(与用 w 打开相反) - 有什么特殊原因吗?

请注意,在模式/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+和的区别ww截断文件。以防万一检查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_forwardecho 0 >>ip_forward确实将值更改为1to0但不更改 mtime。echo 1 >ip_forward确实改变了时间。

相关内容