Как текущая локаль в Linux влияет на работу с именами файлов в коде C? - PullRequest
1 голос
/ 25 июня 2019

Я работаю с интернационализированными именами файлов в моей C-программе. В частности, мой кусок кода, где я создаю файл с китайским символом:

int fd = open("/tmp/⺴", O_WRONLY | O_CREAT | O_TRUNC);

Эта функция работает хорошо, и файл создается, несмотря на то, что мой системный язык русский (LANG = ru_RU.UTF-8).

Почему этот файл создан, в то время как моя локаль, кажется, не поддерживает коды китайских символов? В этом случае, каково поле, на которое влияет языковой стандарт системы?

1 Ответ

3 голосов
/ 25 июня 2019

Функция open(2) является просто оболочкой для системного вызова open и не делает ничего другого, кроме помещения аргументов в правильные регистры, выполнения системного вызова и получения его возвращаемого значения.

А ядро ​​вообще не знает и не заботится о локалях.

В частности, в аргументе path open(2) единственными байтами, имеющими особое значение, являются 47 (/), которые разделяют элементы пути, и 0 (байт NUL), который его завершает.

Ни ядро, ни большинство файловых систем не помешают вам создавать файлы с искаженными именами utf-8 или любым двоичным мусором - для ядра это всего лишь байты.

Кроме того, ядро ​​не выполняет юникодную нормализацию или обработку сбиваемых значений:

$ echo > ∕еtс∕раsswd; touch hó hó
$ ls
hó  hó  ∕еtс∕раsswd
...