iofunc_attr_t

Структура атрибутов ввода/вывода (атрибутивная запись)

Прототип:

#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() разблокирует атрибутную запись.

Note: Поток должен разблокировать атрибутную запись столько раз, сколько он её заблокировал.

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()).

Note: Одно или более полей времени могут быть недействительными в результате вызова функции семейства 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 системной библиотеки