我正在以初学者的身份学习 android 内核。我可以读取 system/core/init/init.c
函数 main()
中的宏 ERROR()
抛出的消息dmesg
命令通过 adb。我观察到在 main()
中调用函数 open_devnull_stdio()
后,dmesg
不再显示 ERROR() 抛出的消息
。
为了找到原因,我开始深入研究 system/core/init/util.c
中 open_devnull_stdio()
的声明,我发现这一行我可以'不懂
static const char *name = "/dev/__null__"
;
实际上在设备的 /dev/
中没有名为 __null__
的文件,但是有一个名为 null
的文件,我能够使用 adb pull
获取它,它是一个 0 字节(空)文件。
那么为什么文件名要用双下划线 (__) 包裹起来?
这是 util.c 的链接
最佳答案
在 C 中,在开始前、结束后或两者都使用双下划线没有特殊目的。从 C 的角度来看,文件名只是一个字符串,操作系统可以自由地以任何方式解释它选择。从 Linux 的角度来看,同样适用。文件名中的下划线只是字符。它们与字母 b
和 t
没有区别对待。
如果我猜对了,我正在阅读 the same file as you (链接到您正在阅读的源代码可能是个好主意)那么在您提到的代码之后的代码行中执行的操作应该非常明显。接下来的几行是:
if (mknod(name, S_IFCHR | 0600, (1 << 8) | 3) == 0) {
fd = open(name, O_RDWR);
unlink(name);
创建空设备,然后打开并立即再次删除。
我怀疑这样做是为了让程序可以在不访问根文件系统的情况下运行,并且仍然能够打开 /dev/null
的等价物。
关于android - 在 c 文件名的开头和结尾之后使用双下划线 ( __ ) 的目的是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45952330/