C 기반 프로그램에서 이 기능을 사용하고 싶은데 ioctl
EVIOCGRAB
인터넷 검색을 통해 이 기능을 사용하는 다양한 예제 소스 코드를 찾았지만 이를 올바르게 사용하는 방법을 설명하는 명확한 문서를 찾는 데 어려움을 겪고 있습니다.
나는에서 보았다읽기 및 쓰기 제어(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
? 다양한 샘플 코드를 보고 나서 할 수 있는 건생각하다0이 아닌 값은 장치를 잡고, 0 값은 장치를 해제합니다.
나는 다음과 같은 임의의 코드 예제에서 이것을 얻었습니다.
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
?
답변1
ㅏ명확한최소한 커널 소스 코드에서 자세한 설명을 찾을 수 있습니다 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
, , ...)이 되고 "true"(not ) 0
로 평가되는 모든 것은 ( , , ... )가 됩니다.0
evdev_grab
(void*)1
1
0xDEADBEEF
첫 번째 예를 언급할 가치가 있습니다.
int grab = 1;
ioctl(fd, EVIOCGRAB, &grab);
..
ioctl(fd, EVIOCGRAB, NULL);
의도치 않게 작동할 뿐입니다. 이것은 가치가 아니다~에, grab
그러나 사실 은 0이 아닙니다(반례가 가 아니기 &grab
때문에 이것을 추측했을 수도 있습니다 . 흥미롭습니다. :)grab = 0; ioctl(…, &grab);
ioctl(…, NULL);