Книга: Операционная система UNIX

Файловые дескрипторы

Файловые дескрипторы

Файловый дескриптор представляет собой неотрицательное целое число, возвращаемое системными вызовами, такими как creat(2), open(2) или pipe(2). После получения файлового дескриптора процесс может использовать его для дальнейшей работы с файлом, например с помощью системных вызовов read(2), write(2), close(2) или fcntl(2).

Ядро обеспечивает работу процесса с файлами, используя различные структуры данных, часть из которых расположена в u-area процесса. Напомним, что эта область описывается структурой user. В табл. 4.7 приведены поля структуры user, которые используются ядром для обеспечения доступа процесса к файлу.

Таблица 4.7. Поля структуры user, связанные с файловым дескриптором

Поле Описание
u_ofile Указатель на системную файловую таблицу
u_pofile Флаги файлового дескриптора

Файловый дескриптор связан с этими двумя полями и, таким образом, обеспечивает доступ к соответствующему элементу файловой таблицы (структуре данных file).

В настоящее время в качестве единственного флага файлового дескриптора определен флаг FD_CLOEXEC. Если этот флаг установлен, то производится закрытие файлового дескриптора (аналогично явному вызову close(2)) при выполнении процессом системного вызова exec(2)). При этом для запущенной программы не происходит наследования файлового дескриптора и доступа к файлу.

Более старые версии UNIX используют статическую таблицу дескрипторов, которая целиком хранится в u-area. Номер дескриптора является индексом этой таблицы. Таким образом, размер таблицы, которая обычно содержит 64 элемента, накладывает ограничение на число одновременно открытых процессом файлов. В современных версиях таблица размещается динамически и может увеличиваться при необходимости. Следует, однако, иметь в виду, что и в этом случае максимальное число одновременно открытых файлов регламентируется пределом RLIMIT_NOFILE, который рассматривался в разделе "Ограничения" главы 2. В некоторых версиях, например, Solaris 2.5, данные файловых дескрипторов хранятся не в виде таблицы, а в виде блоков структур uf_entry, поля которой аналогичны приведенным в табл. 4.7.

Содержимое таблицы дескрипторов процесса можно посмотреть с помощью утилиты crash(1M). Команда user покажет содержимое u-area процесса. Например, для текущего командного интерпретатора мы получим следующую информацию:

# crash
> proc #8591
PROC TABLE SIZE = 1498
SLOT ST  PID PPID PGID  SID UID PRI NAME FLAGS
 121  s 8591 8589 8591 8591 286  48 bash load jctl
> user 121
PER PROCESS USER AREA FOR PROCESS 121
PROCESS MISC:
 command: bash, psargs: -bash
 start: PO Mon 24 18:11:31 1997
 mem: 1ebc, type: exec
 vnode of current directory: f5b95e40
OPEN FILES, POFILE FLAGS, AND THREAD REFCNT:
  [0] : F 0xf62b6030, 0, 0 [1] : F 0xf62b6030, 0, 0
  [2] : F 0xf62b6030, 0, 0
 cmask: 0022
RESOURCE LIMITS:
 cpu time: unlimited/unlimited
 file size: unlimited/unlimited
 swap size: 2147479552/2147479552
 stack size: 8388608/2147479552
 coredump size: unlimited/unlimited
 file descriptors: 64/1024
 address space: unlimited/unlimited
SIGNAL DISPOSITION:
...

Оглавление книги


Генерация: 0.737. Запросов К БД/Cache: 3 / 0
поделиться
Вверх Вниз