我正在使用C-Program中的国际化文件名合作。特别是我的代码,我在其中创建了中文符号的文件:
int fd = open("/tmp/⺴", O_WRONLY | O_CREAT | O_TRUNC);
尽管我的系统语言环境是俄罗斯(lang = ru_ru.utf-8(。
为什么在我的语言环境似乎不支持中文符号的代码时创建此文件?在这种情况下
open(2)
函数只是open
系统调用的包装器 - 并且没有采取任何其他操作以将参数放在正确的寄存器中,执行系统调用并检索其返回值。
和内核根本不知道或关心地区。
具体而言,在open(2)
的path
参数中,唯一具有特殊意义的字节为47(/
(,将路径元素和0(nul字节(分开。
内核不是大多数文件系统都不会阻止您创建具有畸形UTF-8或任何二进制垃圾的名称的文件 - 对于内核,它们只是字节。
另外,内核不进行任何Unicode归一化或混淆的处理:
$ echo > ∕еtс∕раsswd; touch hó hó
$ ls
hó hó ∕еtс∕раsswd