c语言 - 什么可能导致"regular"类型的文件在 Linux 中不可读以及如何识别这一点



我正在迭代我的整个文件系统,使用幻数等标识符查找某些类型的文件。

我偶然发现了一些应该是"常规"(DT_REG(类型文件的文件,但无法读取该文件(read系统调用返回错误 38 - 系统调用未实现(。这些文件被称为"alloc_calls",位于"/sys/kernel/slab/:d-xxxxx/"(其中xxxxx是一个数字,类似于0001024(。
以下是其中一个文件的ls -lfilecat的输出:

root@VMint:/# ls -l /sys/kernel/slab/:d-0001024/alloc_calls
-r-------- 1 root root 4096 Aug  8 18:55 /sys/kernel/slab/:d-0001024/alloc_calls
root@VMint:/# file /sys/kernel/slab/:d-0001024/alloc_calls
/sys/kernel/slab/:d-0001024/alloc_calls: ERROR: cannot read /sys/kernel/slab/:d-0001024/alloc_calls' (Function not implemented)
root@VMint:/# cat /sys/kernel/slab/:d-0001024/alloc_calls
cat: '/sys/kernel/slab/:d-0001024/alloc_calls': Function not implemented

我写了一些 c 代码来演示这一点:

#include <errno.h>
#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
void main()
{
char buf;
int fd = open("/sys/kernel/slab/:d-0001024/alloc_calls", 0);
perror("open");
read(fd, &buf, 1);
perror("read");
printf("fd: %d, errno: %dn",fd, errno);
}

执行此代码将获得:

# gcc ./enosys.c -o enosys
# c_test sudo ./enosys           
open: Success
read: Function not implemented
fd: 3, errno: 38

常规文件怎么可能对于 root 来说是不可读的?另外,如何识别此类文件?

/proc/sys中的文件是神奇的。它们不是真正的文件——当你读写它们时,你实际上是在读写各种内核数据结构。 (mount命令将显示它们都是挂载的文件系统,分别为procsysfs类型。

对于存在于这两个目录中的任何"文件",这意味着存在一个内核数据结构,有人认为以这种方式公开可能很有用。 为了进行公开,必须设置不同的代码来实现read()从数据结构中获取,write()存储到数据结构。

因此,对于以这种方式公开的给定内核数据结构,如果有人实际做的是实现(比如(写入而不是读取特定数据结构,你会看到这样的结果。

当您调用read()时,实际发生的是内核查找文件系统,也许还有您正在读取的单个文件,应该为该文件使用哪个设备相关的read实现。 如果没有,错误(自然足够(是ENOSYS"未实现系统调用"。

另外,如何识别此类文件?

我怀疑有没有办法! 但在/proc/sys之外,它可能永远不会发生。 无论如何,您可能希望从任何像这样的自动搜索中排除/proc/sys- 那里有很多魔力,所以当你开始不分青红皂白地读取文件时,会发生很多奇怪的事情。

相关内容

最新更新