android - 在 c 文件名的开头和结尾之后使用双下划线 ( __ ) 的目的是什么?

标签 android c linux-kernel embedded-linux android-source

我正在以初学者的身份学习 android 内核。我可以读取 system/core/init/init.c 函数 main() 中的宏 ERROR() 抛出的消息dmesg 命令通过 adb。我观察到在 main() 中调用函数 open_devnull_stdio() 后,dmesg 不再显示 ERROR() 抛出的消息

为了找到原因,我开始深入研究 system/core/init/util.copen_devnull_stdio() 的声明,我发现这一行我可以'不懂

static const char *name = "/dev/__null__";

实际上在设备的 /dev/ 中没有名为 __null__ 的文件,但是有一个名为 null 的文件,我能够使用 adb pull 获取它,它是一个 0 字节(空)文件。

那么为什么文件名要用双下划线 (__) 包裹起来?

这是 util.c 的链接

最佳答案

在 C 中,在开始前、结束后或两者都使用双下划线没有特殊目的。从 C 的角度来看,文件名只是一个字符串,操作系统可以自由地以任何方式解释它选择。从 Linux 的角度来看,同样适用。文件名中的下划线只是字符。它们与字母 bt 没有区别对待。

如果我猜对了,我正在阅读 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/

相关文章:

android - 在屏幕上均匀分布 TextView,并左右对齐

objective-c - 当调试器摘要显示文本时,为什么此 NSString 长度为零?

c++ - 如何编译在docker中使用内核函数的C代码并在容器中使用pci设备?

linux-kernel - 是否可以从 Linux Kernel 中的驱动程序代码调用设备层代码

android - 插入具有复合主键的android sqlite3表的问题

android - 调用setTextColor后,TextView中没有出现文字

java - 通知点击事件而不显示 Activity ?

c - 提示可能的变量值/范围的C编译器(GCC或Clang)

c - 当用户按 "Enter"而不是一个空格字符时如何结束该程序?

Docker 和 PaX 主机