Портируя файл, устройство и сеть I/O

OS X предлагает большинству стандартных механизмов UNIX для файла и устройства I/O. Существуют, однако, различия для знания при портировании приложения на OS X с других основанных на UNIX и подобных UNIX платформ.

В этой главе описываются файловый ввод-вывод и устройство I/O в OS X, включая APIs, который улучшит пользовательский опыт, такой как файловый менеджер APIs для доступа к файлу.

Если Вы - коммерческий разработчик программного обеспечения или если Ваше приложение будет использоваться конечными пользователями, необходимо считать эту главу.

Если Вы пишете порт приложения с открытым исходным кодом или внутреннего приложения UNIX, необходимо считать эту главу, только если приложение уже использует или планирует использовать альтернативный файл APIs для других платформ или если необходимо сделать устройство I/O.

Как Работает Файловый ввод-вывод OS X

OS X содержит весь стандартный UNIX и функциональность файлового ввода-вывода POSIX. Для основного порта приложения к OS X Вы обычно не должны вносить изменения в этой области, если Ваше приложение не предполагает, что файловая система хранит файлы чувствительным к регистру способом. (HFS +, файловая система Mac по умолчанию, является сохранением случая, но не чувствительный к регистру.)

Однако традиционные приложения Mac имеют некоторое улучшенное поведение, которое можно хотеть включить в приложение. Когда их расположение изменилось, самым мощным из них является использование псевдонимов для нахождения файлов. Не возможно использовать эту возможность через стандартный UNIX APIs. Для получения этой функциональности необходимо использовать или Углерод или Какао APIs.

Например, некоторые приложения Mac также используют в своих интересах HFS + возможность файловой системы обработать мультиразветвленные файлы. Это могло использоваться, например, чтобы хранить доступную информацию о файле, таком как последнее положение окна. Не рекомендуется, чтобы решающая информация хранилась в ветвях ресурсов при записи новых приложений. Однако по причинам совместимости, Вы, возможно, должны получить доступ к данным, хранившим в ветвях ресурсов, если Ваше приложение должно считать файлы, создаваемые более старыми приложениями Mac, или если Вы пишете резервный инструмент, который должен сохранить все содержание файла.

Кроме того, приложения Mac представляют файловую систему по-другому, чем приложения POSIX в открытом и сохраняют диалоговые окна. Приложения Mac имеют структуру каталогов, многокорневую от отдельных объемов вместо отдельно внедренного от корневого объема. Используя Углерод или Какао APIs достигает этого представления файловой системы автоматически. Этот APIs также представляет стандартный файл, открывают и сохраняют диалоговые окна, соответствующие, типичный пользователь испытывают это, пользователи Mac приехали для ожидания.

Прежде, чем переместить в интерфейс файлового браузера Углерода или Какао, необходимо рассмотреть, какие виды пользователей, вероятно, будут использовать приложение на платформе Mac. Они главным образом испытаны в использовании другой основанной на UNIX платформы или являются ими в основном пользователи Mac?

Если они - главным образом пользователи UNIX, диалоговое окно файла Mac может сбить с толку им. Если они - главным образом пользователи Mac, традиционное диалоговое окно файла UNIX может одинаково сбить с толку. Необходимо обычно выбирать который файл API для использования на основе долгосрочных ожиданий, а не текущей базы пользователей для предотвращения проблем по линии.

Используя углерод APIs для файлового ввода-вывода

Углерод APIs полезен при записи файлового ввода-вывода полностью в C. Они обеспечивают очень основной доступ во многом как традиционный POSIX APIs.

Таблица 7-1  POSIX по сравнению с углеродом APIs

Функция POSIX

Функция углерода

Описание

open, fopen

FSOpenFork

Берет ссылку файловой системы (FSRef) как параметр и возвраты ссылочный номер ветвления.

close, fclose

FSClose

Берет ссылочный номер ветвления в качестве параметра.

create

FSCreateFileUnicode

Берет FSRef из родительского каталога и имени файла, который будет создаваться.

mkdir

FSCreateDirectoryUnicode

Берет FSRef из родительского каталога и имени каталога, который будет создаваться.

rmdir

FSDeleteObject

Удаляет файл или папку ( FSRef).

unlink

FSDeleteObject или FSDeleteFork

Удаляет файл или папку ( FSRef) или удалите единственное ветвление файла.

Обратите внимание на то, что эти функции использование FSSpec и FSRef структуры, а не имена файлов. Функции FSRefMakePath и FSPathMakeRef преобразуйте FSRef к пути и наоборот. Точно так же FSpMakeFSRef преобразовывает FSSpec к FSRef.

Используя какао APIs для файлового ввода-вывода

Файл какао APIs очень отличается от традиционного POSIX APIs. Объяснение Какао APIs выходит за рамки этой книги. Для получения дополнительной информации о файле Какао APIs см. Руководство по программированию Файловой системы.

Представление открытого файла и сохраняет диалоговые окна

Открытый файл и сохраняет диалоговые окна, может быть представлен в OS X с помощью диалогового окна файла Углерода или Какао APIs. Если Вы принимаете решение использовать стандартные диалоговые окна, используйте тот же API, который Вы использовали для остальной части Вашего GUI.

Диалоговое окно файла Углерода API, Navigation Services, описано в Ссылке Navigation Services в Документации Углерода.

Диалоговое окно файла Какао API состоит из функций NSOpenPanel и NSSavePanel, для открытого и сохраняют диалоговые окна. Они описаны в управлении Файлом приложения в Документации Какао.

Как устройство OS X работы I/O

OS X обеспечивает многие традиционные механизмы UNIX для устройства I/O. Однако проекты драйвера отдельного устройства определяют, использовать ли эти механизмы.

В OS X к дисковым устройствам, устройствам последовательного порта, псевдоустройству генератора случайных чисел и pseudo-tty устройствам (pttys) традиционно получают доступ через стандартные блочные устройства стиля UNIX и устройства посимвольного ввода-вывода. Другие псевдоустройства (устройства без аппаратной поддержки) могут также быть реализованы как устройства BSD. Можно использовать эти файлы устройств таким же образом, как Вы использовали бы их в любой другой основанной на UNIX или подобной UNIX системе.

Большинство фактических устройств, однако, таких как USB и устройства FireWire не обрабатывается с блочными устройствами или устройствами посимвольного ввода-вывода в OS X. Вместо этого основной механизм для доступа к устройствам через пользовательские клиенты Набора I/O, которые являются интерфейсами в основном вызова удаленной процедуры или системного вызова, позволяющими Вам вызывать функции в драйвере ядра из приложения.

Для доступа к устройству необходимо использовать APIs для поиска дерева устройств устройство, соответствующее различные параметры. Вы тогда вызываете функции в драйвере. Механизм, используемый для вызывания этих функций, зависит от проекта интерфейса устройства, также, как и сами функции. Можно также получить информацию об устройстве с помощью стандартизированного механизма, предоставленного Набором I/O для исследования его свойств в дереве устройств.

Устройством нельзя управлять из приложения, если нет драйвер в ядре. Во многих случаях драйвер может быть простой передачей, представляющей интерфейс устройства, позволяющий драйверу физического устройства быть частью самого приложения. В других случаях это может быть полный драйвер для устройства, представляющего интерфейс устройства для конфигурации. Интерфейс устройства может быть предоставлен самим OS X (таким как интерфейс устройства пространства пользователя для USB устройства HID), или это может быть предоставлено отдельным поставщиком оборудования (таким как драйвер звуковой карты).

Реализация пользовательского клиента выходит за рамки этого документа. Это описано подробно в книге Accessing Hardware From Applications. Так как проект пользовательского клиента также в большой степени зависит от проекта интерфейса устройства, с которым это соединяется, Вы, возможно, также должны считать документацию, определенную для рассматриваемой технологической области. В случае интерфейсов устройства, создаваемых поставщиками оборудования, Вы, возможно, также должны связаться с поставщиком оборудования для дополнительной программной информации.

Организация файловой системы

Организация файловой системы OS X немного отличается от той из большинства сред UNIX и описана подробно в странице справочника hier. Этот раздел представляет только наиболее важные различия между типичной средой UNIX и OS X.

Во-первых, OS X имеет много папок, предназначенных прежде всего для использования с приложениями GUI или для частей самого OS X. Эти пути обычно запускаются с прописной буквы и включают:

Кроме того, различные наборы портов доступны, и устанавливают файлы в различных расположениях, такой как /sw (штрейкбрехер), /usr/local (GNU-Дарвин), и /opt/local/ (Дарвинские Порты).

Несколько каталогов, включая /etc и /tmp фактически символьные ссылки в /private. Необходимо бояться топать на этих символьных ссылках.

Наконец, необходимо знать, что по умолчанию, много каталогов скрыты от пользователей при просмотре файловой системы с помощью OS X GUI. Эти каталоги включают большинство стандартных системных каталогов, включая /bin, /dev, /etc, /sbin, /tmp, и /usr. Эти каталоги все еще появляются и ведут себя ожидаемым способом, когда получено доступ из командной строки. Для получения дополнительной информации о создании их видимых из приложений GUI, посмотрите Структуру Файловой системы и Видимость.

OS X имеет различные наборы полномочия для доступа к файловой системе. У пользователей по умолчанию есть доступ для записи к их корневому каталогу и определенным другим каталогам, создаваемым в предыдущих версиях Mac OS. У администраторских пользователей есть доступ для записи к дополнительным частям системы, включая различные каталоги приложения и конфигурационные файлы, без потребности стать пользователем root. Наконец, каталоги, содержащие OS самостоятельно, только для чтения за исключением корня.

Как работают сети Mac OS

OS X обеспечивает обычный POSIX и BSD сетевая функциональность. Для получения дополнительной информации о фактическом APIs см. Страницы справочника OS X.

По большей части эти сети ведут себя точно так же, как они делают в любой другой системе UNIX. OS X отличается одним решающим способом, как бы то ни было. Это не использует /etc/hosts, /etc/resolv.conf, и другие подобные конфигурационные файлы для конфигурации сети. (Более точно, файл /etc/resolv.conf предоставлен для использования только для чтения, но не должен быть изменен непосредственно. Файл /etc/hosts предоставлен, но не используется по умолчанию.)

Если необходимо сконфигурировать настройки сервера имен (или другие параметры сети), необходимо использовать платформу Конфигурации системы (описанный в Инструкциях по Программированию Конфигурации системы и Ссылке Платформы Конфигурации системы).

Если необходимо добавить статические записи узла, необходимо использовать Службы каталогов (описанный в Ссылке Платформы Службы каталогов, dscl страница руководства, и Открывает Directory и dscl Инструмент в другом месте в этом документе).