Насколько мне известно, номера ioctl хорошо определяются драйверами и регистрируются в ядре.
Я играл с некоторым кодом на питоне для запроса состояний джойстика. Я прочитал этот документ об API джойстика, этот документ о числах ioctl и это из модуля python fcntl.
Я создал программу C для тестирования и запроса значений, а также тесты Python с кодом, который я взял отсюда для реализации макроса _IOR()
C.
Драйвер ядра определяет:
monolith@monolith ~/temp $ grep JSIOCGAXES /usr/include/* -r
/usr/include/linux/joystick.h:#define JSIOCGAXES _IOR('j', 0x11, __u8)
C программа
#include <stdio.h>
#include <linux/joystick.h>
#include <fcntl.h>
int main() {
int fd = open("/dev/input/js0", O_RDONLY);
printf("Ioctl Number: (int)%d (hex)%x\n", JSIOCGAXES, JSIOCGAXES);
char number;
ioctl(fd, JSIOCGAXES, &number);
printf("Number of axes: %d\n", number);
close(fd);
return 0;
}
Вывод программы C:
monolith@monolith ~/temp $ ./test
Ioctl Number: (int)-2147390959 (hex)80016a11
Number of axes: 6
Вывод Python
# check if _IOR results in the used ioctl number in C
>>> _IOR(ord('j'), 0x11, 'c')
-2147390959
>>> file = open("/dev/input/js0")
# use that integer
>>> fcntl.ioctl(file, -2147390959)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
IOError: [Errno 14] Bad address
# ask what hex value is
>>> "%x" % -2147390959
'-7ffe95ef'
# WHY THIS HEX CONVERSION DIFFERS?
>>> fcntl.ioctl(file, -0x7ffe95ef)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
IOError: [Errno 14] Bad address
# Use the hex value from the C program output
>>> fcntl.ioctl(file, 0x80016a11)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
IOError: [Errno 14] Bad address
Любые идеи, почему я не могу запросить дескриптор файла с этим номером ioctl? Функции ioctl()
и fcntl()
принимают дескриптор файла или объект с реализованным методом fileno()
, поэтому я исключаю ошибку из объекта file
.
Может быть, проблема связана с преобразованием чисел и типами, понятия не имею ... подсказки?
fcntl.fcntl()
, я получаю эту ошибку:OverflowError: signed integer is greater than maximum
. Теперь мне нужно знать, почему Cioctl()
правильно управляет аргументом. Cioctl()
принимаетint
в качестве аргумента. Будет ли отслеживание смещенияint
подходом к определениюsigned integer
в python? - person Sebastian   schedule 14.07.2012