![无法读取常规文件 - IO 操作块](https://linux22.com/image/9519/%E6%97%A0%E6%B3%95%E8%AF%BB%E5%8F%96%E5%B8%B8%E8%A7%84%E6%96%87%E4%BB%B6%20-%20IO%20%E6%93%8D%E4%BD%9C%E5%9D%97.png)
我正在编写一个程序,扫描 Android 设备中的所有文件,查找特定的字符串。在整个过程几秒钟后,我陷入了以下文件:
/sys/power/wakelock_count
我尝试使用grep,C函数福彭,以及其他替代方案,它们都在该文件上阻塞 IO - 它们永远不会返回。它的大小正好是 4096 字节,但是使用统计数据或者ls-l该文件被报告为常规文件- 没有符号链接,没有设备文件。我检查了打开的句柄 - 该文件是通过系统_SE,它也恰好保存了数十个其他文件的句柄,但我可以很好地阅读它们。我还检查了锁,没有强制的阻止读访问的锁。
该文件有什么特别之处?我如何阅读或跳过它?
编辑:我以 SU 身份运行所有操作。
编辑2:LS-LD结果:
-rw-r--r-- 1 system system 4096 1971-10-10 21:59 wakeup_count
答案1
请注意,这/sys/power/wakeup_count
并不是真正的“常规”文件,因为它不在“常规”文件系统上。在“sysfs-power”文件系统上几乎可以肯定,它与“proc”文件系统类似,因为它并不真正代表磁盘上的文件之类的东西。
What: /sys/power/wakeup_count
Date: July 2010
Contact: Rafael J. Wysocki <[email protected]>
Description:
The /sys/power/wakeup_count file allows user space to put the
system into a sleep state while taking into account the
concurrent arrival of wakeup events. Reading from it returns
the current number of registered wakeup events and it blocks if
some wakeup events are being processed at the time the file is
read from. Writing to it will only succeed if the current
number of wakeup events is equal to the written value and, if
successful, will make the kernel abort a subsequent transition
to a sleep state if any wakeup events are reported after the
write has returned.
因此,挂起读取可能不是问题,尽管鉴于上述文档,挂起很长时间似乎不太可能。
但是,您很可能会遇到此错误: 从 /sys/power/wakeup_count 读取无限期挂起 这与您描述的症状几乎完全相同。
答案2
无论 是否存在特定问题/sys/power/wakeup_count
,答案是/sys
文件系统中的文件是特殊的虚拟文件。读写它们可以提供对内核功能的访问。或其他虚拟文件系统下的某些文件可能/sys
会在读取时阻塞,直到发生特定事件。
排除/sys
和/proc
。正如您排除命名套接字、命名管道或设备文件(例如在/dev
.如果您正在编写一个通用工具来搜索任何指定的目录,您可能希望让用户搜索他们喜欢的内容,并期望他们自己避免问题 - 这就是 Unix Way (TM)。
在当前的 Linux 上,自动特殊虚拟文件系统挂载将全部位于/dev
、/sys
、/proc
和 之下/var/lib/nfs/rpc_pipefs/
。年纪稍大的也可能有/selinux
。您不必担心将来会添加新的特殊路径,因为/sys/fs
它现在用作任何新的特殊文件系统的转储地。
一种传统的方法是仅搜索特定的文件系统,例如find -xdev
.您可以使用df
列出所有非特殊文件系统。例如,如果/
和/home
是您要搜索的单独文件系统:
find / /home -xdev -type f -exec grep search-string \{\} \+