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

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

Файловый дескриптор представляет собой неотрицательное целое число, возвращаемое системными вызовами, такими как 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:

...

Данный текст является ознакомительным фрагментом.