ioperm(2) устанавливает права на работу с портами ввода/вывода

ОБЗОР

#include <sys/io.h> /* для glibc */

int ioperm(unsigned long from, unsigned long num, int turn_on);

ОПИСАНИЕ

Вызов ioperm() устанавливает num бит прав доступа вызывающей нити, начиная с адреса порта from. Если turn_on не равно 0, то права для указанных битов устанавливаются, иначе сбрасываются. Если turn_on не равно 0, вызывающая нить должна быть привилегированной (CAP_SYS_RAWIO).

До Linux 2.6.8, можно было указывать только первые 0x3ff портов ввода-вывода. Для остальных портов нужно было использовать системный вызов iopl(2) (с аргументом level равным 3). Начиная с Linux 2.6.8, можно указывать 65536 портов ввода-вывода.

Права не наследуются при вызове fork(2); последующий вызов fork(2) в потомке должен включить те права, которые ему нужны. Права сохраняются при вызове execve(2); это можно использовать для предоставления доступа к портам ввода-вывода непривилегированным программам.

Данный вызов, в основном, предназначен для архитектуры i386. На большинстве других архитектур он не существует или будет возвращать ошибку.

ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ

При успешном выполнении возвращается 0. В случае ошибки возвращается -1, а errno устанавливается в соответствующее значение.

ОШИБКИ

EINVAL
Неверные значения from или num.
EIO
(на PowerPC) Этот системный вызов не поддерживается.
ENOMEM
Не хватает памяти.
EPERM
Вызывающая нить не имеет достаточно прав.

СООТВЕТСТВИЕ СТАНДАРТАМ

Вызов ioperm() есть только в Linux. Он не должен использоваться в переносимых программах.

ЗАМЕЧАНИЯ

В /proc/ioports показываются все порты ввода-вывода, которые выделены в системе в настоящий момент.

В glibc прототип ioperm() расположен в <sys/io.h> и <sys/perm.h>. Не используйте последний вариант, он существует только для i386.