在哪里可以找到 ioctl EVIOCGRAB 文档?

在哪里可以找到 ioctl EVIOCGRAB 文档?

我想ioctl EVIOCGRAB在基于 C 的程序中使用该函数,通过谷歌搜索,我找到了使用该函数的各种示例源代码,但我正在努力寻找正确描述如何正确使用它的明确文档。

我看到从读写控制(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_列表(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

答案1

A确定的您至少可以在内核源代码中找到解释,更具体地说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);
     […]
     }
 […]
 }

据我了解,所有评估为“假”(0)的东西都会导致evdev_ungrab(void*)0,,0...),所有“真”(不是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);。有趣。:)

相关内容