НАЗВАНИЕ
streamio - управление псевдоустройствами
СИНТАКСИС
#include <stropts.h> int ioctl (fildes, command, arg) int fildes, command;
ОПИСАНИЕ
Управление псевдоустройствами [см. intro(2)]
Аргумент fildes - это дескриптор открытого файла, определяющий поток. Аргумент command задает выполняемую команду, как описано ниже. Аргумент arg задает дополнительные аргументы для этой команды. Тип аргумента arg зависит от команды. Обычно это int или указатель на какую-либо структуру.
Поскольку управление псевдоустройствами осуществляется с помощью системного вызова ioctl(2), ошибки, описанные в ioctl(2), относятся и к управлению псевдоустройствами. В дополнение к этим ошибкам системный вызов может закончиться неудачей, а переменная errno получит значение EINVAL, если поток, определяемый дескриптором файла, мультиплексируется, либо аргумент command имеет значение, не применимое к этому потоку.
Ошибки могут обнаруживаться модулями и драйверами псевдоустройств. В этом случае модуль или драйвер посылает сообщение, содержащее код ошибки, истоку потока, переменной errno присваивается значение, равное посланному коду ошибки, а соответствующий системный вызов завершается неудачей.
Следующие команды системного вызова ioctl(2) применимы ко всем псевдоустройствам.
Процессы, желающие получать сигнал SIGPOLL, должны обязательно выдать команду I_SETSIG. Если несколько процессов запросило сигнализацию об одних и тех же событиях одного и того же потока, при наступлении события сигналы будут посланы всем.
Если значение arg равно 0, процесс удаляется из списка процессов, которым нужно посылать сигнал SIGPOLL.
При неудаче переменная errno принимает одно из следующих значений:
При неудаче переменная errno принимает одно из следующих значений:
При неудаче переменная errno принимает одно из следующих значений:
struct strpeek { struct strbuf ctlbuf; struct strbuf databuf; long flags; };Поля ctlbuf.maxlen и databuf.maxlen [см. getmsg(2)] должны быть установлены равными количеству извлекаемых байт из управляющей области и области данных соответственно. Если поле flags имеет значение RS_HIPRI, из очереди на чтение истока будут извлекаться только приоритетные сообщения.
Команда I_PEEK возвращает значение 1, если сообщение было извлечено. Результат равен 0, если в очереди не чтение истока нет сообщений или если установлен флаг RS_HIPRI, а в очереди на чтение истока нет приоритетных сообщений. Ожидание сообщений не производится. При возврате поле ctlbuf задает информацию из управляющей области, databuf - из области данных, flags содержит значение 0 или RS_HIPRI.
При неудаче переменная errno принимает следующее значение:
При неудаче переменная errno принимает следующее значение:
При неудаче переменная errno принимает следующее значение:
При неудаче переменная errno принимает следующее значение:
Аргумент arg указывает на структуру типа struct strfdinsert:
struct strfdinsert { struct strbuf ctlbuf; struct strbuf databuf; long flags; int fildes; int offset; };Поле ctlbuf.len [см. putmsg(2)] должно иметь значение, равное размеру указателя плюс количество байт в управляющей области сообщения. Поле fildes задает дескриптор файла другого потока. Поле offset, которое должно быть выравнено по границе слова, задает смещение от начала управляющей области ячейки памяти, куда команда I_FDINSERT занесет указатель на структуру очереди чтения драйвера потока, определяемого fildes. Поле databuf.len должно иметь значение, равное количеству байт в области данных сообщения, или значение 0, если область данных отсутствует.
Поле flags задает тип посылаемого сообщения. Если поле flags имеет значение 0, посылается неприоритетное сообщение, а если поле flags имеет значение RS_HIPRI, посылается приоритетное сообщение. Для неприоритетных сообщений, в случае если очередь на запись потока заполнена, команда I_FDINSERT заблокируется в ожидании свободного места. Для приоритетных сообщений блокировки в этом случае не происходит. Если для потока установлен флаг O_NDELAY, то для неприоритетных сообщений, в случае если очередь на запись потока заполнена, команда I_FDINSERT не блокируется, а завершается неудачей с присваиванием переменной errno значения EAGAIN.
Команда I_FDINSERT посылает сообщения только целиком, и может, вне зависимости от приоритетности сообщения и установки флага O_NDELAY, заблокироваться в ожидании свободных блоков для сообщения в потоке (если при этом не происходит исчерпания системных ресурсов).
При неудаче переменная errno принимает одно из следующих значений:
Описываемая команда предназначена для посылки управляющих сообщений для определенных модулей или драйверов потока. Информация передается вниз по потоку до тех пор, пока не встретится модуль, который ее обработает и пошлет ответное сообщение вверх. Команда I_STR блокируется до тех пор, пока не придет сообщение, подтверждающее выполнение запрошенного действия или отвергающее его, либо истечет определенный период времени. В случае истечения времени команда завершается неудачей с присваиванием переменной errno значения ETIME.
Только одна команда I_STR может быть активной в потоке, все последующие команды I_STR блокируются до тех пор, пока ответ от активной команды I_STR не дойдет до истока. Время ожидания по умолчанию равен 15 секундам. Наличие флага O_NDELAY [см. open(2)] в этой команде игнорируется.
Аргумент arg должен указывать на структуру типа struct strioctl:
struct strioctl { int ic_cmd; /* Команда */ int ic_timout; /* Время ожидания */ int ic_len; /* Длина данных */ char *ic_dp; /* Указатель на данные */ };В поле ic_cmd задается внутренняя команда, предназначенная модулю или драйверу потока. В поле ic_timeout задается время ожидания: -1 - бесконечное, 0 - по умолчанию, > 0 - указанное количество секунд. В поле ic_len задается длина передаваемых данных, а в поле ic_dp - указатель на данные. Поле ic_len используется для двух целей: на входе в нем задается длина передаваемых данных, а на выходе в него записывается длина ответа. Буфер, на который указывает поле ic_dp, должен иметь достаточный размер для приема любого ответа от любого модуля или драйвера потока.
Исток преобразует информацию из структуры strioctl в формат внутреннего управляющего сообщения и посылает это сообщение вниз.
При неудаче переменная errno принимает одно из следующих значений:
Команда I_SENDFD извлекает системный описатель файла с дескриптором arg. Порождается сообщение, в которое записывается этот описатель, а также идентификатор пользователя и идентификатор группы процесса, выполняющего команду I_SENDFD. Сообщение помещается непосредственно в очередь на чтение [см. intro(2)] истока потока на другом конце конвейера, в который входит данный поток.
При неудаче переменная errno принимает одно из следующих значений:
struct strrecvfd { int fd; unsigned short uid; unsigned short gid; char fill [8]; };В поле fd возвращается дескриптор файла. В поля uid и gid - идентификатор пользователя и идентификатор группы процесса, выполнявшего команду I_SENDFD.
Если отсутствует флаг O_NDELAY [см. open(2)], команда I_RECVFD блокируется до тех пор, пока не придет какое-нибудь сообщение. Если флаг O_NDELAY присутствует, а в истоке нет никаких сообщений, команда I_RECVFD завершается неудачей с присваиванием переменной errno значения EAGAIN.
Если полученное сообщение действительно послано командой I_SENDFD, образуется новый дескриптор файла, описатель которого передан в сообщении. Новый дескриптор помещается в поле fd структуры типа strrecvfd, на которую указывает аргумент arg.
При неудаче переменная errno принимает одно из следующих значений:
При неудаче переменная errno принимает одно из следующих значений:
При неудаче переменная errno принимает одно из следующих значений:
СМ. ТАКЖЕ
intro(2), close(2), fcntl(2), getmsg(2), ioctl(2),
open(2), poll(2), putmsg(2), read(2), signal(2),
sigset(2), write(2) в Справочнике программиста.
ДИАГНОСТИКА
Если не оговорено противное, то в случае успеха результат, возвращаемый системным вызовом ioctl, равен 0. В
случае неудачи возвращается -1, а переменной errno
присваивается код ошибки.