Структура атрибутов ввода/вывода (атрибутивная запись)
#include <sys/iofunc.h>
typedef struct _iofunc_attr {
IOFUNC_MOUNT_T *mount;
uint32_t flags;
int32_t lock_tid;
uint16_t lock_count;
uint16_t count;
uint16_t rcount;
uint16_t wcount;
uint16_t rlocks;
uint16_t wlocks;
struct _iofunc_mmap_list *mmap_list;
struct _iofunc_lock_list *lock_list;
void *list;
uint32_t list_size;
#if !defined(_IOFUNC_OFFSET_BITS) || _IOFUNC_OFFSET_BITS == 64
#if _FILE_OFFSET_BITS - 0 == 64
off_t nbytes;
ino_t inode;
#else
off64_t nbytes;
ino64_t inode;
#endif
#elif _IOFUNC_OFFSET_BITS - 0 == 32
#if !defined(_FILE_OFFSET_BITS) || _FILE_OFFSET_BITS == 32
#if defined(__LITTLEENDIAN__)
off_t nbytes;
off_t nbytes_hi;
ino_t inode;
ino_t inode_hi;
#elif defined(__BIGENDIAN__)
off_t nbytes_hi;
off_t nbytes;
ino_t inode_hi;
ino_t inode;
#else
#error endian not configured for system
#endif
#else
#if defined(__LITTLEENDIAN__)
int32_t nbytes;
int32_t nbytes_hi;
int32_t inode;
int32_t inode_hi;
#elif defined(__BIGENDIAN__)
int32_t nbytes_hi;
int32_t nbytes;
int32_t inode_hi;
int32_t inode;
#else
#error endian not configured for system
#endif
#endif
#else
#error _IOFUNC_OFFSET_BITS value is unsupported
#endif
uid_t uid;
gid_t gid;
time_t mtime;
time_t atime;
time_t ctime;
mode_t mode;
nlink_t nlink;
dev_t rdev;
} iofunc_attr_t;
Структура iofunc_attr_t
описывает атрибуты устройства, ассоциированного с менеджером ресурсов. Включает в себя:
- mount
- Указатель на структуру с информацией о точке монтирования. По умолчанию, эта структура типа
iofunc_mount_t
, но тип может быть изменен переопределением IOFUNC_MOUNT_T
. - flags
- Флаги, которые может установить менеджер ресурсов, чтобы отобразить состояние устройства. Состоит из комбинации следующих флагов:
- IOFUNC_ATTR_ATIME
- Время доступа больше не действительно. Обычно устанавливается при чтении из ресурса.
- IOFUNC_ATTR_CTIME
- Время изменения состояния больше не действительно. Обычно устанавливается при изменении информации о файле.
- IOFUNC_ATTR_DIRTY_NLINK
- Число ссылок изменилось.
- IOFUNC_ATTR_DIRTY_MODE
- Режим mode изменился.
- IOFUNC_ATTR_DIRTY_OWNER
- uid или gid изменились.
- IOFUNC_ATTR_DIRTY_RDEV
- rdev изменился, например mknod().
- IOFUNC_ATTR_DIRTY_SIZE
- size изменился.
- IOFUNC_ATTR_DIRTY_TIME
- Один или более из mtime, atime, или ctime изменились.
- IOFUNC_ATTR_MTIME
- Время последнего изменения больше не действительно. Обычно устанавливается при записи в ресурс.
В дополнение к вышеперечисленному, менеджер ресурсов может любым образом использовать биты из диапазона определенного IOFUNC_ATTR_PRIVATE
(См. <sys/iofunc.h>
). - lock_tid
- Идентификатор потока, заблокировавшего атрибутную запись. Для поддержки нескольких потоков в менеджере ресурсов нужно заблокировать структуру атрибутной записи, чтобы одновременно только один поток мог изменять её. Менеджер ресурсов автоматически блокирует атрибутную запись (используя iofunc_attr_lock()), когда вызываются определенные функции (например
IO_*
). - lock_count
- Сколько раз поток блокировал атрибутную запись. Пользователь может блокировать структуру атрибутов вызовом iofunc_attr_lock() или iofunc_attr_trylock(). Вызов функции iofunc_attr_unlock() разблокирует атрибутную запись.
| Поток должен разблокировать атрибутную запись столько раз, сколько он её заблокировал. |
- count
- Количество блоков управления открытым контекстом (OCB) использующих эту атрибутную запись. Если число равно 0, то ни один OCB не использует эту атрибутную запись.
- rcount
- Количество OCB использующих эту структуру атрибутов для чтения.
- wcount
- Количество OCB использующих эту структуру атрибутов для записи.
- rlocks
- Количество блокировок чтения зарегистрированных на эту структуру атрибутов.
- wlocks
- Количество блокировок записи зарегистрированных на эту структуру атрибутов.
- mmap_list и lock_list
- Управление специфичной функциональностью ресурса. mmap_list используется функциями iofunc_mmap() и iofunc_mmap_default(); lock_list используется функцией iofunc_lock_default(). Обычно не требуется как либо изменять или проверять эти поля.
- list
- Зарезервировано для будущего использования.
- list_size
- Размер зарезервированной области. Зарезервировано для будущего использования.
- nbytes
- Количество байт в ресурсе. Менеджер ресурсов может менять это значение. Для файла это будет его размер. Для специальных устройств (например
/dev/null
), которые не поддерживают lseek() или имеют принципиально иную интерпретацию lseek(), это поле не используется. В таких случаях рекомендуется установить это поле в 0, если нет какой-либо другой осмысленной интерпретации этого значения. - inode
- Индексный декспритор, специфичный для точки монтирования, должен быть уникальным для каждой точки монтирования. Можно указать свое собственное значение или
0
, чтобы менеджер процессов сам заполнил это поле. В любом случае интерпретация этого поля зависит от пользователя. - uid и gid
- Идентификатор пользователя (UID) и группы (GID) владельца этого ресурса. Эти поля обновляются автоматически вспомогательными функциями chown() (например iofunc_chown_default()) и используются совместно с режимом доступа mode при проверке прав доступа вспомогательными функциями open() (например iofunc_open_default()).
- mtime, atime, и ctime
- поля времени POSIX:
- mtime
- время последней записи (обновляется функцией write()).
- atime
- время последнего чтения (обновляется функцией read()).
- ctime
- время последнего изменения статуса (обновляется функциями write(), chmod() и chown()).
| Одно или более полей времени могут быть недействительными в результате вызова функции семейства iofunc. Чтобы определить является ли поле времени недействительным, считайте флаги flags. Это необходимо, чтобы избежать лишних обращений к ядру с запросами текущего времени от каждого обработчика сообщений ввода/вывода лишь для того, чтобы заполнить поля времени в структуре атрибутов. |
. Чтобы заполнить поля правильным временем, нужно вызвать iofunc_time_update(). - mode
- Режим доступа ресурса (например тип, разрешения). Допустимые режимы могут быть выбраны из серии констант
S_*
в <sys/stat.h>
. См. struct stat. - nlink
- Количество ссылок на это конкретное имя. Менеджер ресурсов может изменить это поле. Для имён, которые представляют собой директорию, это значение должно быть не менее 2 (одна ссылка для самого каталога, и одна для соответствующей ему записи ./ ).
- rdev
- Номер устройства для специальных символьных устройств и номер rdev для именованных специальных устройств.
ЗОСРВ «Нейтрино»
time_t, iofunc_attr_lock(), iofunc_attr_trylock(), iofunc_attr_unlock(), iofunc_lock_default(), iofunc_mmap(), iofunc_mmap_default(), iofunc_ocb_t, iofunc_time_update()
Предыдущий раздел: Описание API системной библиотеки