Intereting Posts
как установить папку назначения для wget? Получение pid для процесса ssh, который основывался на себе hexedit: изменить количество столбцов (байт на строку) Возможно ли переопределить учетную запись пользователя службы RPM во время установки? Как я могу отладить проблему Suspend-to-RAM в Linux? Неисправность, связанная с gtk / gtk.h, даже если она установлена Как увеличить размер файловой системы для соответствия раздела Отображать статус возврата без нуля в PS1 Sar vs df -h … несоответствие между процентом корневой файловой системы Как предотвратить преждевременное выполнение $ () при создании псевдонима Использование \ $ в конце имени переменной передается grep Удаление управляющих символов с помощью sed регистрация терминала не завершается, когда я закрываю терминал Как установить Sublime Text в качестве текстового редактора по умолчанию? настроить ddclient для возврата внутреннего ip вместо общедоступного ip

Где я могу найти документацию EVOOCGRAB?

Я хочу использовать функцию ioctl EVIOCGRAB в программе на основе C, и из googling вокруг я нашел несколько бит примера исходного кода, который использует эту функцию, но я изо всех сил пытаюсь найти ясную документацию, которая правильно описывает, как правильно ее использовать.

Я вижу, что из ioctl (2) функция ioctl определяется как

 int ioctl(int d, unsigned long request, …); 

И что:

  The third argument is an untyped pointer to memory. It's traditionally char *argp (from the days before void * was valid C), and will be so named for this discussion. 

И я надеялся найти EVIOCGRAB перечисленные в ioctl_list (2) , но это не так.

Поэтому я не знаю, какой должен быть третий аргумент для функции EVIOCGRAB . После просмотра различных битов кода примера все, что я могу сделать, это предположить, что ненулевое значение захватывает устройство и что нулевое значение освобождает его.

Который я получил от случайных примеров кода, таких как

 int grab = 1; ioctl(fd, EVIOCGRAB, &grab); .. ioctl(fd, EVIOCGRAB, NULL); 

или

 ioctl(fd, EVIOCGRAB, (void*)1); .. ioctl(fd, EVIOCGRAB, (void*)0); 

или

 ioctl(fd, EVIOCGRAB, 1); .. ioctl(fd, EVIOCGRAB, 0); 

(Который, кажется, пахнет куском программирования культа.)

Итак, где я могу найти окончательное объяснение параметра управления EVIOCGRAB ?

Окончательное объяснение, которое вы можете найти, по крайней мере, в источниках ядра, в частности, drivers/input/evdev.c :

  static long evdev_do_ioctl(struct file *file, unsigned int cmd, void __user *p, int compat_mode) { […] switch (cmd) { […] case EVIOCGRAB: if (p) return evdev_grab(evdev, client); else return evdev_ungrab(evdev, client); […] } […] } 

Как я понимаю, все, что оценивает «false» ( 0 ), приведет к evdev_ungrab ( (void*)0 , 0 , …), все, что есть »true« (не 0 ), вызовет evdev_grab ( (void*)1 , 1 , 0xDEADBEEF …).

Стоит упомянуть, что ваш первый пример,

 int grab = 1; ioctl(fd, EVIOCGRAB, &grab); .. ioctl(fd, EVIOCGRAB, NULL); 

работает только непреднамеренно. Это не значение внутри grab , но тот факт, что &grab отличен от нуля (вы могли бы догадаться об этом, так как встречный регистр не grab = 0; ioctl(…, &grab); но ioctl(…, NULL); Смешно. 🙂