Книга: Искусство программирования для Unix
20.3.1. Unix-файл представляет собой только большой блок байтов
20.3.1. Unix-файл представляет собой только большой блок байтов
Любой файл в Unix представляет собой только большой блок байтов без каких-либо других атрибутов. В частности, не существует возможности сохранять за пределами данных файла информацию о его типе или указатель на связанную прикладную программу.
В более широком смысле все рассматривается как поток байтов. Даже аппаратные устройства являются потоками байтов. Данная метафора была большим успехом ранней Unix и большим преимуществом в мире, где (например) компилируемые программы не могли осуществлять вывод, который мог бы быть отправлен обратно компилятору. Из данной метафоры выросли каналы и shell-программирование.
Однако метафора байтового потока в Unix настолько существенна, что в Unix имеются проблемы при интеграции программных объектов с операциями, которые не вписываются в байтовый поток или файловый состав операций (создание, открытие, чтение, запись, удаление). Это особенно является проблемой для GUI-объектов, таких как пиктограммы, окна и "активные" документы. Внутри классической Unix- модели мира единственный способ расширить существующую метафору байтового потока заключается в использовании вызовов ioctl
, печально известных как уродливая коллекция лазеек в пространство ядра.
Приверженцы операционных систем семейства Macintosh склонны громогласно критиковать это. Они пропагандируют модель, в которой одно имя файла может иметь как "ветвь" данных, так и "ветвь" ресурсов. Ветвь данных соответствует байтовому потоку в Unix, а "ветвь" ресурсов является семейством пар имя/значение. Приверженцы Unix предпочитают такие подходы, которые делают данные файла самоописательными, так чтобы фактически те же метаданные хранились внутри файла.
Проблема Unix-подхода состоит в том, что каждая программа, которая записывает файл, должна иметь информацию о его структуре. Таким образом, например, если требуется, чтобы информация о типе файла хранилась внутри данного файла, то каждое инструментальное средство, обрабатывающее данный файл, должно "позаботиться" о том, чтобы либо сохранить поле типа неизменным, либо интерпретировать его, а затем перезаписать. Несмотря на то, что организовать это теоретически возможно, на практике такие конструкции были бы слишком хрупкими.
С другой стороны, поддержка файловых атрибутов сопряжена с трудными вопросами о том, какие файловые операции должны их сохранять. Очевидно, что при копировании именованного файла в другой именованный файл должны также копироваться атрибуты файла источника, как и его данные. Однако что произойдет, если файл был перенаправлен в новый файл с помощью команды cat(1)?
Ответ на этот вопрос зависит от того, что подразумевается под атрибутами — они действительно представляют собой свойства имен файлов, или они некоторым волшебным способом встроены в данные файла как разновидность неотображаемого заголовка или окончания файла. Какие операции сделают свойства отображаемыми?
Разработчики файловой системы Xerox PARC боролись с данной проблемой в 70-х годах прошлого века. Для конструкции был характерен "открытый сериализованный" вызов, который возвращал байтовый поток, содержащий как атрибуты, так и содержимое файла. Если вызов применялся к каталогу, то он возвращал сериализацию атрибутов каталога плюс сериализацию всех файлов, хранящихся в нем. Не заметно, чтобы этот подход когда-либо был усовершенствован.
Ядро 2.5 Linux уже поддерживает присоединение подобных пар имя/значение как свойств имени файла, однако на момент написания данной книги эта возможность еще широко не использовалась в приложениях. Последние версии операционной системы Solaris имеют приблизительно эквивалентную функцию.
- 20.3.1. Unix-файл представляет собой только большой блок байтов
- 20.3.2. Слабая поддержка GUI-интерфейсов в Unix
- 20.3.3. Удаление файлов в Unix необратимо
- 20.3.4. Unix предполагает статичную файловую систему
- 20.3.5. Конструкция системы управления задачами была плохо реализована
- 20.3.6. В Unix API не используются исключительные ситуации
- 20.3.7. Вызовы ioctl(2) и fcntl(2) являются препятствиями
- 20.3.8. Модель безопасности Unix, возможно, слишком примитивна
- 20.3.9. Unix имеет слишком много различных видов имен
- 20.3.10. Файловые системы могут считаться вредными
- 20.3.11. На пути к глобальному адресному пространству Internet
- 20.3.9. Unix имеет слишком много различных видов имен
- 20.3.10. Файловые системы могут считаться вредными
- 20.3.8. Модель безопасности Unix, возможно, слишком примитивна
- Резервное копирование многофайловых баз данных
- Восстановление из резервных копий многофайловых баз данных
- Ответный файл, используемый по умолчанию (csc.rsp)
- Статистика по блокировкам
- Создание файлов с блокировкой
- Файлы базы данных InterBase
- Файлы *.GDB изнутри
- Эффективная работа с временными файлами сортировки
- Единое имя файла параметров InterBase