Есть ли путь POSIX, который не может назвать файл?

1912
Charles Stewart

Существуют ли в POSIX допустимые пути, которые нельзя связать с файлом, обычный или неправильный? То есть ради чего test -e "$LEGITIMATEPOSIXPATHNAME"не может добиться успеха?

Разъяснение № 1: пути

Под «легальными путями в POSIX» я подразумеваю те, которые, как говорит POSIX, разрешены, а не те, которые POSIX явно не запрещает. Я посмотрел это, и спецификация POSIX называет их символьными строками, которые:

  1. Используйте только символы из переносимого набора символов имени файла [a-zA-Z0-9._-](см. Http://www.opengroup.org/onlinepubs/009695399/basedefs/xbd_chap03.html#tag_03_276 );
  2. Не начинай с -; а также
  3. Длина от 1 до NAME_MAX, число, не указанное для POSIX, не менее 14.

POSIX также позволяет, что файловые системы, вероятно, будут более расслабленными, чем это, но запрещает символы NUL и /появляться в именах файлов. Обратите внимание, что такое парадигматически UNIX-имя файла, как lost+foundне FPF, согласно этому определению. Есть еще одна константа PATH_MAX, использование которой не нуждается в дополнительном объяснении.

Идеальный ответ будет использовать FPF, но меня интересует любой пример с именами файлов, которые POSIX явно не запрещает.

Разъяснение № 2: невозможность

Очевидно, что имена путей обычно могут быть связаны с файлом. Но семантика UNIX скажет вам, что есть специальные места, в которых обычно не могут быть созданы произвольные файлы, как в /devкаталоге. Есть ли в POSIX такие специальные места? Вот к чему идет вопрос.

4
Хммм, мне было интересно, если этот заголовок не может быть более описательным, но то, что я придумаю, кажется, приводит к противоречию в терминах ... Arjan 14 лет назад 4
намного лучший заголовок, спасибо. quack quixote 14 лет назад 0
Просто записка ... это не \ это /. В Unix \ - это прекрасный символ в файле. / пользователь / Чак / Том \ Мэри имя файла = Том \ Мэри. DrFloyd5 14 лет назад 0
@DrFloyd: верно. Исправлена. Charles Stewart 14 лет назад 0
Мне нравится этот вопрос. Это напоминает мне «Der Mouse» при переходе от VMS к UNIX, который раздражался, потому что он не мог найти способ создать имя файла с косой чертой или нулем в нем - где косая черта была частью имени файла в каталоге, а не разделитель между каталогом и чем-то в каталоге. // Стандартные API POSIX не выдают ошибку в таких именах файлов, они просто интерпретируют внедренные специальные символы как разделитель пути или разделитель строк. Krazy Glew 8 лет назад 1

5 ответов на вопрос

3
Anonymous

Тестирование имени файла с нулевым символом в нем всегда должно завершаться неудачей.

POSIX резервирует '/' и ноль из имен файлов. Это разумно: один является разделителем каталогов, а другой - разделителем строк. Чтобы поддержать эту точку, Википедия говорит, что ext2, ext3 и ext4 разрешают все байты в именах файлов, кроме null и косой черты. NTFS, в режиме POSIX-совместимости или нет, запрещает немного больше; и варианты FAT также запрещают ноль. Теоретически, это действительно зависит от файловой системы. Но я не задерживаю дыхание, пытаясь найти случай, когда null находит путь к имени файла.

+1 за ответ, который заставил меня поискать что-то. POSIX запрещает "/" и NUL в именах файлов. Ср мои вопросы постскриптум Charles Stewart 14 лет назад 0
3
harrymc

Поскольку последний вопрос заключается в том, существуют ли специальные места, в которых обычно не может быть файла, например, в каталоге / dev, указанном в POSIX, тогда ответом будет YES .

Полный список заранее определенных файлов и каталогов приведен в главе 10, POSIX Структура каталогов и устройств, в IEEE Open Group Base спецификации Выпуск 6 :

Следующие каталоги должны существовать в соответствующих системах, и соответствующие приложения должны использовать их только так, как описано. Строго соответствующие приложения не должны создавать файлы в любом из этих каталогов, если это не указано ниже.

/
Корневой каталог.
/ dev
Содержит / dev / console, / dev / null и / dev / tty, описанные ниже.

Следующий каталог должен существовать в соответствующих системах и должен использоваться как описано:

/ tmp
Каталог, доступный для приложений, которым требуется место для создания временных файлов. Приложениям разрешается создавать файлы в этом каталоге, но не следует предполагать, что такие файлы сохраняются между вызовами приложения.

Следующие файлы должны существовать в соответствующих системах и должны быть доступны для чтения и записи:

/ dev / null
Бесконечный источник данных и приемник данных. Данные, записанные в / dev / null, должны быть отброшены. Чтение из / dev / null всегда должно возвращать конец файла (EOF).
/ dev / tty
В каждом процессе - синоним управляющего терминала, связанного с группой процессов этого процесса, если таковой имеется. Это полезно для программ или процедур оболочки, которые хотят быть уверены в записи сообщений или чтении данных с терминала, независимо от того, как перенаправлен вывод. Он также может использоваться для приложений, которые требуют имя файла для вывода, когда требуется типизированный вывод, и утомительно выяснять, какой терминал используется в настоящее время.

Следующий файл должен существовать в соответствующих системах и не должен быть доступен для чтения или записи:

/ dev / console
Файл / dev / console - это общее имя, данное системной консоли (см. Системная консоль). Обычно он связан с определенным реализацией специальным файлом. Он должен обеспечивать интерфейс к системной консоли, соответствующий требованиям тома Базовых определений стандарта IEEE Std 1003.1-2001, Глава 11, Общий интерфейс терминала.

Я предполагаю, что термин «файлы» также включает в себя каталоги, поэтому в вашем примере программа POSIX не может также предположить, что она может создать каталог с именем «невозможно». Используемая терминология немного сбивает с толку, и я предполагаю, что авторы не предполагали, что / dev может содержать каталоги. harrymc 14 лет назад 0
`/ dev` может и обычно содержит каталоги: SunOS уже давно монтирует fsfs в` / dev / fd`, и она скопирована большинством современных UNIX. Но POSIX запрещает, чтобы файл был и специальным символом, и каталогом, поэтому в `/ dev / tty` ничего не может быть. Так выбрано: у меня есть ответ. Charles Stewart 14 лет назад 0
2
Demi

/dev/null/impossible cannot exist. This is because /dev/null must be a file, and so cannot be a directory.

Same for /dev/tty/impossible and /dev/console/impossible

1
grawity

«Правильный путь в POSIX» уже означает, что он может указывать на объект файловой системы (файл, каталог, символическая ссылка и т. Д.).

Во-вторых, некоторые файловые системы (например, FAT) имеют ограничения на допустимые символы в именах файлов. Таким образом, в моем компьютере ~/fs/phone/This:is*a?file|name.txtбудет отклонен vfatдрайвер файловой системы.


Чтобы ответить на второй вопрос, test -e "$LEGITIMATEPOSIXPATHNAME"не удается, когда файл не существует, очевидно.

Хе-хе, +1 за последний абзац. Есть ответ на любой вопрос, наверное. :-) Arjan 14 лет назад 0
s / терпит неудачу / не может преуспеть / Charles Stewart 14 лет назад 0
Я не знаком ни с одним * nix, где `/ dev / fd / this-is-not-file 'может быть файлом, но IIUC, POSIX не говорит, что это не может быть файл. Таким образом, наличие правильного пути в POSIX не означает, что POSIX-совместимая ОС должна разрешать создание файла там. Charles Stewart 14 лет назад 1
-1: полностью упускает суть вопроса. Charles Stewart 14 лет назад 0
@ Чарльз, мне кажется странным, что ты подавляешь голос, хотя я думаю, что твой вопрос не совсем понятен для начала. (И у * все еще * есть очень плохой заголовок, который вообще не вопрос - http://superuser.com/faq) Arjan 14 лет назад 0
@Arjan: Название изменено. Так как люди не понимают этого, я думаю, вы должны быть правы, что это не ясно, но я не вижу, в чем проблема. Он принимает форму «Есть ли X, который есть Y», где X знакомы, а Y точно определен. Charles Stewart 14 лет назад 0
0
harrymc

Тест не пройдёт, если имя файла нарушит ограничения локальной реализации POSIX.

Каждая существующая файловая система делает предположения относительно максимальной длины, пределов рекурсии каталогов и многого другого. Поэтому имя POSIX, допустимое в одной операционной системе, может быть недопустимым в другой.

Поэтому я отвечаю на вопрос «Да»:
даже имена, которые являются законными при тестировании в одной системе POSIX, могут быть отклонены другой из-за ограничений реализации.

Каждое имя пути, которое POSIX считает допустимым, по определению принимается во всех POSIX-совместимых файловых системах. Это то, что меня волнует. Charles Stewart 14 лет назад 0
Ну, NAME_MAX и PATH_MAX зависят от реализации. Я думаю, что вы противоречите себе, когда спрашиваете (1) о недостижимых именах файлов POSIX, и в то же время (2) принимаете во всех POSIX-совместимых системах. По определению, допустимые имена файлов не могут быть недостижимыми, и наименьший общий знаменатель всех систем POSIX всегда доступен на всех них. harrymc 14 лет назад 0
Ага! Нет, я хочу, чтобы имена путей работали, за исключением того, что другие предположения в POSIX препятствуют существованию файлов Charles Stewart 14 лет назад 0