EVIOCGRAB에 대한 ioctl 문서는 어디에서 찾을 수 있습니까?

EVIOCGRAB에 대한 ioctl 문서는 어디에서 찾을 수 있습니까?

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로 평가되는 모든 것은 ( , , ... )가 됩니다.0evdev_grab(void*)110xDEADBEEF

첫 번째 예를 언급할 가치가 있습니다.

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

의도치 않게 작동할 뿐입니다. 이것은 가치가 아니다~에, grab그러나 사실 은 0이 아닙니다(반례가 가 아니기 &grab때문에 이것을 추측했을 수도 있습니다 . 흥미롭습니다. :)grab = 0; ioctl(…, &grab);ioctl(…, NULL);

관련 정보