Операционная система 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 FLAGS121 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: -bashstart: PO Mon 24 18:11:31 1997mem: 1ebc, type: execvnode of current directory: f5b95e40OPEN FILES, POFILE FLAGS, AND THREAD REFCNT:[0] : F 0xf62b6030, 0, 0 [1] : F 0xf62b6030, 0, 0[2] : F 0xf62b6030, 0, 0cmask: 0022RESOURCE LIMITS:cpu time: unlimited/unlimitedfile size: unlimited/unlimitedswap size: 2147479552/2147479552stack size: 8388608/2147479552coredump size: unlimited/unlimitedfile descriptors: 64/1024address space: unlimited/unlimitedSIGNAL DISPOSITION:...Файловая таблица
Поля файлового дескриптора
и u_u_ofileсодержат начальную информацию, необходимую для доступа процесса к данным файла. Дополнительная информация находится в системной файловой таблице и таблице индексных дескрипторов. Для обеспечения доступа процесса к данным файла ядро должно полностью создать цепочку от файлового дескриптора до vnode и, соответственно, до блоков хранения данных, как показано на рис. 4.12.pofileКаждый элемент файловой таблицы содержит информацию, необходимую для управления работой с файлом. Если несколько процессов открывают один и тот же файл, каждый из них получает собственный элемент файловой таблицы, хотя все они будут работать с одним и тем же файлом. Важнейшие поля элемента файловой таблицы приведены ниже:
Поле Описание f_flagФлаги, указанные при открытии файла (системные вызовы open(2), creat(2)). Каждая операция с файлом проверяется на допустимость согласно указанным режимам. Другими словами, если процесс открыл файл только для чтения (флаг ), ему будет отказано в операции записи, даже если он имеет на это необходимые права доступа.FREADFREADФайл открыт только для чтения. То же, что и при открытии файла.O_RDONLYFWRITEФайл открыт только на запись. То же, что и при открытии файла.O_WRONLYFAPPENDРежим добавления. Перед началом операции записи файловый указатель будет установлен в конец файла. То же, что и при открытии файла.O_APPEND ,FNONBLOCKFNDELAYВозврат без блокирования. Системный вызов не будет ожидать завершения операции. То же, что и илиO_NONBLOCKпри открытии файла.O_NDELAYFSYNCОбеспечить синхронизацию с соответствующими дисковыми структурами для метаданных и данных файла при совершении операции записи. То же, что и при открытии файла.O_SYNCFDSYNCОбеспечить синхронизацию с соответствующими дисковыми структурами только для данных файла при совершении операции записи. То же, что и при открытии файла.O_DSYNCFRSYNCСовместно с флагами иFSYNCопределяет процесс синхронизации для соответствующих компонентов файла при операции чтения.FDSYNCf_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 VFLAG2 0 f0286570 f5c6b2a0 c 24,26 f5e91c18 0 -Поскольку это специальный файл устройства (об этом свидетельствует поле TYPE элемента файловой таблицы), поле
(v_data) vnode указывает не на inode файловой системы ufs, а на snode — индексный дескриптор логической файловой системы specfs, обслуживающей специальные файлы устройств. Более подробно этот интерфейс будет рассматриваться в следующей главе. Таким образом, для продолжения путешествия по структурам данных ядра, следует обратиться к snode, адрес которого указан в полеVDATA.VDATA