ОБЗОР
#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.