我想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);
。有趣。:)