Всё выше перечисленные структуры определены в <sys/mtio.h>:
/*Операции с носителем: ioctl(fd, MTIOCTOP, &struct mtop) */
struct mtop { short mt_op; /* Операция (MTWEOF, например.) */ int mt_count; /* Повторный счет. */ };
#define MTWEOF 0 /* Запись маркера конца файла */ #define MTFSF 1 /* Передняя метка пространства файла */ #define MTBSF 2 /* Обратная метка пространства файла */ #define MTFSR 3 /* Передняя запись пространства */ #define MTBSR 4 /* Обратная запись пространства */ #define MTREW 5 /* Перемотать ленту */ #define MTOFFL 6 /* Автономная перемотка */ #define MTNOP 7 /* Операций нет, устанавливает состояние */ #define MTRETEN 8 /* Повторная перемока (целиком)*/ #define MTERASE 9 /* Стереть ленту и перемотать */ #define MTEOM 10 /* Позиция Конец Носителя */ #define MTMODE 11 /* Выбрать плотность ленты */ #define MTBLKZ 12 /* Выбрать размер блока ленты */
/* Состояние носителя: ioctl(fd, MTIOCGET, &struct mtget) */
struct mtget { short mt_type; /* Тип устройства. */
/* Устройство зависимых "регистраторов". */ short mt_dsreg; /* Регистр состояния диска. */ short mt_erreg; /* Ошибка регистра. */
/* Misc info. */ off_t mt_resid; /* Остаточный счёт. */ off_t mt_fileno; /* Текущий номер файла. */ off_t mt_blkno; /* Текущий номер блока внутри файла. */ off_t mt_blksize; /* Текущий размер блока. */ };
См. mt(1) для детального описания того, что выполняет каждая команда в отдельности. mt_type поле является всегда нулевым и не несёт в себе ничего. Mt_dsreg 0 (OK), 1 (Error), или 2 (EOF скинут). Mt_erreg, поддерживающий SCSI, считывает ключ последней операции. Mt_blksize - текущий размер ленты в байтах. Если размер является переменым, то значение равно нулю.
Обратите внимание на возможность применения команд в описываемом файле, который используется для чтения или записи не доступных mt. Таким образом, Вы можете добавить eof (Маркеры конца файла) маркеры в середину выходного потока или получиь данные о состоянии устройства перед перемоткой и завершением.
Драйвер автоматически добавит маркер конца файла на плёнке с записью, если Вы выполните свободную команду. Если Вы записываете eof маркеры самостоятельно, то драйвер не будет добавлять одно дополнительное пространство по завершении.