Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Учеб.пос.СП.doc
Скачиваний:
28
Добавлен:
31.03.2015
Размер:
1.33 Mб
Скачать
    1. Стандартные дескрипторы

Согласно принятым соглашениям, первые три файловых дескриптора передаются процессу уже открытыми. Дескриптор с номером 0 соответствует устройству ввода, дескриптор с номером 1 – устройству стандартного вывода, а с номером 2 – устройству стандартного вывода сообщений об ошибках. Эти три дескриптора обычно используются для управления терминалом. В текстах программ вместо номеров удобнее использовать константы STDIN_FILENO, STDOUT_FILENO и STDERR_FILENO.

Утилиты Unix должны выполнять чтение входных данных из STDIN_FILENO и записывать результаты в STDOUT_FILENO, благодаря этому командная оболочка может объединять их в конвейеры. Для выдачи важных сообщений следует использовать устройство STDERR_FILENO, поскольку любой вывод в STDOUT_FILENO может быть перенаправлен в файл или передан дальше по конвейеру другой утилите, что является обычной практикой при работе с командной оболочкой.

Любой из стандартных дескрипторов может соответствовать обычному файлу, каналу, именованному каналу, устройству и даже сокету. Это отличный способ обеспечить независимость от типа устройства ввода и/или вывода, однако это возможно далеко не всегда. Например, экранный редактор наверняка не сможет работать, если устройство стандартного вывода не является терминальным устройством.

К моменту запуска процесса, три стандартных дескриптора уже открыты и готовы к использованию в вызовах read и write. Процесс может открывать другие дескрипторы, которые используются для работы с файлами, каналами и т.п. Родительский процесс может завещать потомку не только эти три стандартных дескриптора, но и те, что открыл сам.

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

  • open - используется в большинстве случаев, когда можно указать путь к файлу, включая обычные файлы, специальные файлы и именованные каналы;

  • pipe - создает и открывает неименованный канал;

  • socket, accept и connect - используются для создания сетевых соединений.

Дескриптор файла - это индекс в таблице дескрипторов, которая имеется у каждого процесса. Каждый элемент этой таблицы содержит указатель на запись в единой для всей системы таблице описаний открытых файлов. Запись в таблице файлов в свою очередь ссылается на данные в файле. Разные файловые дескрипторы, даже принадлежащие разным процессам, могут ссылаться на одну и ту же запись в таблице файлов.

Каждый вызов open или pipe создает новую запись в таблице и новый дескриптор.

Для каждого файла определяются 9 бит прав доступа: права на чтение, запись и исполнение для владельца файла, группы и всех остальных. Можно наблюдать их в выводе команды ls: -rwxr-xr-x 1 marc users 29808 Aug 4 13:45 hello

Большинство представляют их себе как набор из 9 бит, следующих друг за другом в определенном порядке (владелец, группа, остальные), но это совершенно не обязательно. Так стандартом POSIX1088 вместо восьмеричных чисел для описания прав доступа были рекомендованы к применению специальные идентификаторы. Принцип их именования следует шаблону S_Ipwww, где p определяет режим доступа (R, W или X), а www – кому выдается право на этот режим доступа (USR, GRP или OTH). Например, для предыдущего файла вместо восьмеричного числа 755 можно записать:

S_IRUSR | S_IWUSR | S_IXUSR | S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH

Существуют отдельные идентификаторы для USR, GRP или OTH, которые описывают полные права доступа. Именование этих идентификаторов следует форме S_IRWXw. Здесь символ w определяет, кому выдается право доступа к файлу – U, G или O.Таким образом, предыдущий пример может быть записан в следующем виде: S_IRWXU | S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH

Использование идентификаторов дает разработчикам ОС свободу выбора порядка следования бит, описывающих права доступа к файлу.