Я знаю, что когда я запускаю команду

chmod +x filename

bash сделает мой файл исполняемым. Что именно происходит с архитектурой файла, чтобы изменить его на исполняемый файл? т.е. как ядро узнает, что этот файл исполняемый?

Просто пытаюсь тренировать мои ботанические мышцы.

2 ответа2

6

"Архитектура" файла не меняется - вам нужно убедиться, что он имеет правильный формат. То есть, файл уже должен быть действительной ELF бинарным, или скриптом с действительными #! заголовок или что-то еще, что распознается вашим конкретным ядром (например, a.out или MZ/PE).

Что делает chmod - это просто устанавливает бит в разрешениях файла, сообщая ядру, что пользователю разрешено выполнять этот файл. Он может действовать как небольшой защитный барьер, а также предотвращать определенные виды аварий. (Обратите внимание, что здесь +x - это сокращение от ugo+x ; это бит разрешения, такой же, как чтение / запись.)

Если вы установите +x для файла, который ядро не распознает, он просто вернет код ошибки из системного вызова exec . (Обратите внимание, что некоторые оболочки имеют специальную обработку для этого - если ядро сообщило о "нераспознанном формате", оболочка попытается внутренне интерпретировать файл как скрипт, так как сценарии оболочки работали до #! был изобретен .)

0

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

Вот почему вы не получите аналогичные результаты с некоторыми файловыми системами. А именно, FAT не имеет встроенного пространства, предназначенного для хранения данных, связанных с разрешениями Unix, и Unix обычно обходит это, используя специальный параметр при монтировании такого тома файловой системы. Таким образом, обычно все файлы на диске FAT имеют те же разрешения, что и при монтировании. (Я ожидал бы подобное поведение для других файловых систем, таких как ISO9660, хотя это, вероятно, обычно не записывается.) На томах, смонтированных таким образом, использование chmod +x самом деле ничего не изменит.

Короче говоря, ядро знает об этом, проверяя драйвер файловой системы. Для типичных файловых систем, разработанных для Unix, этот драйвер поддерживает чтение мест, где хранятся разрешения в стиле Unix.

CHMOD просто меняет эти места на диске.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .