Задача Кернигана и Пайка: как поставить косую черту в имени файла?

23

Я только что столкнулся со следующим вопросом в среде программирования Unix , классической книге Кернигана и Пайка о Unix (ниже я нашел текст на стр. 79 издания 1984 года, ISBN: 0-13-937699-2):

Упражнение 3-6. (Вопрос с подвохом) Как вы вводите / в имя файла (т. Е. /, Который не разделяет компоненты пути?

Я много лет работал с Linux, как конечный пользователь, так и программист, но я не могу ответить на этот вопрос. Там нет никакого способа поставить косую черту в именах файлов, это абсолютно запрещено ядром. Вы можете исправить вашу файловую систему с помощью доступа к блочному устройству или использовать похожие символы из Юникода, но это не решения.

Я понимаю, что Linux ≠ Unix, но должен применяться тот же принцип, поскольку система должна иметь возможность однозначно извлекать иерархию каталогов из путей.

Кто-нибудь знает, о чем думали Керниган и Пайк, задавая эти вопросы? Какой был предполагаемый ответ? Что именно «трюк»? Или, может быть, оригинальная система Unix просто позволила избежать этой косой черты?

UPD:

Я связался с Брайаном Керниганом по этому вопросу, и он ответил:

Ответ (или был) «Вы не можете».

Следовательно, Тимоти Мартин был прав и получает зеленую галочку.

firegurafiku
источник
3
Связанный (не повторяющийся) случай, когда кто-то действительно справился с этим: Как удалить файл с именем «filen / ame» (с косой чертой) в файловой системе ext4 в debugfs?
Майкл Гомер
1
Другой связанный unix.stackexchange.com/questions/328928/…
Филипп Киркбрайд
Хм. Возможно, вы могли бы создать файл, содержащий строчные буквы, aи заставить вашу систему думать, что файловая система находится в локали EBCDIC? ASCII aравен 0x61, что соответствует /EBCDIC (кодовая страница 37)
Fox
Сама книга говорит, что это вопрос с подвохом? Если так, то я думаю, что это в значительной степени подтверждает, что вы не сможете найти нестандартный способ сделать это, оставив уже готовые идеи, которые вы уже высказали.
ilkkachu

Ответы:

12

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

Из «Практики программирования» Брайана В. Кернигана и Роба Пайка, гл. 6, стр. 158:

Когда Стив Борн писал свою оболочку Unix (известную как оболочка Борна), он создал каталог из 254 файлов с односимвольными именами, по одному на каждое значение байта, кроме «\ 0» и косой черты, двух символов, которые не может появиться в именах файлов Unix.

Тимоти Мартин
источник
3
Спасибо, что научили меня этой шутке. Это может, вероятно, служить тестом на беглость английского языка (который я только что провалил).
firegurafiku
Ты был прав. Смотри UPD.
firegurafiku
1
@firegurafiku объяснить шутку .
Исаак
5

Я сделал это Это было в системе UNIX, работающей на PDP-11 где-то в 1980 году. Я создал файл под названием «WhatXNow?». Затем я использовал двоичный файл «редактор», чтобы отредактировать устройство на диске и изменить «X» на «/» в inode (с отключенной файловой системой).

Пострадавший так и не понял, как его убрать.

Редактировать: упс, Бармар прав, я не смог увидеть строку о том, что я не исправляю устройство. И да, это был каталог, который я редактировал, а не индекс. Прошло много времени :-)

Тофер Элиот
источник
1
Имена файлов не находятся в inode, они находятся в специальном файле каталога.
Бармар
1
Я подозреваю, fsckчто удалил бы это.
Бармар
1
В вопросе говорится, что вы можете исправлять свою файловую систему с помощью блочного доступа к устройству или использовать похожие символы из Unicode, но это не решения. Разве это не то, что вы описываете в своем ответе?
Бармар
@ Бармар: Хм, может быть, я обдумываю вопрос, а исправление файловой системы - это решение, которое было задумано? Я не знаю.
firegurafiku
Могу поспорить, что это был ответ. Я помню, когда вы могли читать каталоги. Может быть, давным-давно root мог написать их.
Джошуа
1

Любой сценарий , где /(точнее, байты-не символ-со значением 0x2F, почти все ядра Unix намеренно не обращая внимания на кодировку символов) находит свой путь в запись каталога, без необработанных блоков диска , имеющие манипулируют вручную, бесспорно ошибка в ядре.

Такие ошибки случаются время от времени. Я помню, как читал заметки о патче, что некоторые итерации эпохи 1990-х годов… я хочу сказать Solaris, но это может быть неправильно… предложили сервер для протокола AppleTalk Filing Protocol (AFP), который был классическим эквивалентом NFS для MacOS , Беда была в том, что на классических MacOS вы можете /использовать компонент pathname; :вместо этого используется разделитель каталогов . Сервер AFP должен был выполнять моральный эквивалент tr :/ /:при сопоставлении имен файлов, представленных клиентами, с файлами на его диске, но они пропустили несколько путей кода, и поскольку сервер был реализован внутри ядра, он мог фактически записывать неверные записи каталога.

(См. Comp.unix FAQ # 2.2 , подраздел, начинающийся с «Что если в имени файла есть символ« / »?», Для более длинной версии выше.)

zwol
источник