Я попытаюсь дать основной ответ относительно того, как системы Unix обрабатывают файлы. Как указывали другие, ваша формулировка вопроса вводит в заблуждение, поскольку сами файлы не сообщают, какого они типа, а само ядро не решает, какие приложения использовать.
В операционных системах Unix и Windows файлы структурированы просто как последовательность байтов. Из Операционных систем Таненбаума , третье издание:
По сути, операционная система не знает и не заботится о том, что находится в файле. Все это видит байты. Любое значение должно быть наложено программами уровня пользователя.
Вот почему в среде рабочего стола xdg-open
используется для определения приложений по умолчанию для открытия определенных типов файлов.
В системе Unix файлы различаются между обычными и специальными файлами . Обычный файл - это просто пользовательские данные, которые могут быть либо текстовым файлом (кодировка ASCII или Unicode), либо двоичным (исполняемый код). Специальные файлы - это файлы, которые необходимы для работы ОС. К ним относятся каталоги, ссылки, каналы, сокеты и файлы устройств.¹
По соглашению имена файлов содержат расширения, указывающие, к какому типу файлов они могут относиться, например * .c для исходного кода C, * .html для веб-страниц и т. Д. От Tanenbaum:
В некоторых системах (например, UNIX) расширения файлов являются просто соглашениями и не применяются операционной системой. Файл с именем file.txt может быть своего рода текстовым файлом, но это имя больше напоминает владельцу, чем передает какую-либо фактическую информацию на компьютер. С другой стороны, компилятор C может фактически настаивать на том, чтобы файлы, которые он должен компилировать, заканчивался на .c, и он может отказаться от компиляции, если они этого не делают.
Если файл сохранен или переименован без надлежащего расширения, он все равно сохраняет тот же формат для этого типа файла. Именно так большинство файловых менеджеров решают, с какими приложениями открывать файлы, и почему без расширения большинство будет предлагать пользователю «Выберите программу, которую вы хотите использовать для открытия этого файла:».
Наконец, переменные среды используются для определения общесистемных и пользовательских настроек. Например, переменная EDITOR
используется для указания, какой текстовый редактор открывать при обработке текста, например vim
, nano
и т. Д. Таким образом, процессы знают, какой редактор открывать, например, при редактировании git
сообщения фиксации. В противном случае вы правы, указав, какое приложение использовать. Обратите внимание, что vim
обнаруживает типы файлов путем проверки расширений и проверки содержимого файла, если установлен параметр filetype on
, который затем применяет правильную подсветку синтаксиса, отступы и т. Д. ²
TL; DR
Итак, приложения уровня пользователя определяют, с какими программами открывать файл определенного типа, а не саму ОС.