Читать книгу 📗 "Операционная система UNIX - Робачевский Андрей Михайлович"
Содержимое таблицы дескрипторов процесса можно посмотреть с помощью утилиты crash(1M). Команда user покажет содержимое u-area процесса. Например, для текущего командного интерпретатора мы получим следующую информацию:
# <b>crash</b>> <b>proc #8591</b>PROC TABLE SIZE = 1498SLOT ST PID PPID PGID SID UID PRI NAME FLAGS 121 s 8591 8589 8591 8591 286 48 bash load jctl> <b>user 121</b>PER PROCESS USER AREA FOR PROCESS 121PROCESS MISC: command: bash, psargs: -bash start: PO Mon 24 18:11:31 1997 mem: 1ebc, type: exec vnode of current directory: f5b95e40OPEN FILES, POFILE FLAGS, AND THREAD REFCNT: [0] : F 0xf62b6030, 0, 0 [1] : F 0xf62b6030, 0, 0 [2] : F 0xf62b6030, 0, 0 cmask: 0022RESOURCE 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/unlimitedSIGNAL DISPOSITION:...Файловая таблица
Поля файлового дескриптора
u_ofilepofileКаждый элемент файловой таблицы содержит информацию, необходимую для управления работой с файлом. Если несколько процессов открывают один и тот же файл, каждый из них получает собственный элемент файловой таблицы, хотя все они будут работать с одним и тем же файлом. Важнейшие поля элемента файловой таблицы приведены ниже:
| Поле | Описание |
|---|---|
f_flag | Флаги, указанные при открытии файла (системные вызовы open(2), creat(2)). Каждая операция с файлом проверяется на допустимость согласно указанным режимам. Другими словами, если процесс открыл файл только для чтения (флаг FREAD |
FREAD | Файл открыт только для чтения. То же, что и O_RDONLY |
FWRITE | Файл открыт только на запись. То же, что и O_WRONLY |
FAPPEND | Режим добавления. Перед началом операции записи файловый указатель будет установлен в конец файла. То же, что и O_APPEND |
FNONBLOCKFNDELAY | Возврат без блокирования. Системный вызов не будет ожидать завершения операции. То же, что и O_NONBLOCKO_NDELAY |
FSYNC | Обеспечить синхронизацию с соответствующими дисковыми структурами для метаданных и данных файла при совершении операции записи. То же, что и O_SYNC |
FDSYNC | Обеспечить синхронизацию с соответствующими дисковыми структурами только для данных файла при совершении операции записи. То же, что и O_DSYNC |
FRSYNC | Совместно с флагами FSYNCFDSYNC |
f_count | Число файловых дескрипторов, адресующих данный элемент файловой таблицы. Один и тот же элемент файловой таблицы может совместно использоваться при дублировании дескрипторов с помощью системного вызова dup(2) или в результате fork(2). |
f_vnode | Указатель на виртуальный индексный дескриптор файла. |
f_offset | Текущее смещение в файле. Начиная с этого места будет произведена следующая операция чтения или записи. |
Для иллюстрации обсуждения продолжим работу с утилитой crash(1M). С помощью команды user в предыдущем разделе были получены адреса элементов файловой таблицы для стандартного ввода (fd=0), вывода (fd=1) и вывода сообщений об ошибках (fd=2). Заметим, что все они указывают на один и тот же элемент. С помощью команды file исследуем его содержимое:
> <b>file 0xf62b6030</b>ADDRESS RCNT TYPE/ADDR OFFSET FLAGSf62b6030 9 SPEC/f5e91c1c 15834 read write> <b>vnode f5e91c1c</b>VCNT VFSMNTED VFSP STREAMP VTYPE RDEV VDATA VFILOCKS VFLAG 2 0 f0286570 f5c6b2a0 c 24,26 f5e91c18 0 -Поскольку это специальный файл устройства (об этом свидетельствует поле TYPE элемента файловой таблицы), поле
v_dataVDATAVDATA