Pet*_*r M 6 linux documentation ioctl
我想ioctl EVIOCGRAB在基于 C 的程序中使用该函数,并且通过谷歌搜索我找到了使用该函数的各种示例源代码,但我正在努力寻找正确描述如何正确使用它的明确文档。
我从ioctl(2)看到,ioctl函数被定义为
int ioctl(int d, unsigned long request, …);
Run Code Online (Sandbox Code Playgroud)
然后:
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.
Run Code Online (Sandbox Code Playgroud)
我希望EVIOCGRAB在ioctl_list(2) 中找到,但事实并非如此。
所以我不知道EVIOCGRAB函数的第三个参数应该是什么。在看到各种示例代码之后,我所能做的就是假设一个非零值抓住了设备,而一个零值释放了它。
我从随机代码示例中得到的,例如
int grab = 1;
ioctl(fd, EVIOCGRAB, &grab);
..
ioctl(fd, EVIOCGRAB, NULL);
Run Code Online (Sandbox Code Playgroud)
或者
ioctl(fd, EVIOCGRAB, (void*)1);
..
ioctl(fd, EVIOCGRAB, (void*)0);
Run Code Online (Sandbox Code Playgroud)
或者
ioctl(fd, EVIOCGRAB, 1);
..
ioctl(fd, EVIOCGRAB, 0);
Run Code Online (Sandbox Code Playgroud)
(这似乎有点像货物崇拜编程的味道。)
那么我在哪里可以找到EVIOCGRAB控制参数的明确解释呢?
您至少可以在内核源代码中找到明确的解释,更具体地说drivers/input/evdev.c,更具体地说:
static long evdev_do_ioctl(struct file *file, unsigned int cmd,\n void __user *p, int compat_mode)\n {\n [\xe2\x80\xa6]\n switch (cmd) {\n [\xe2\x80\xa6]\n case EVIOCGRAB:\n if (p)\n return evdev_grab(evdev, client);\n else\n return evdev_ungrab(evdev, client);\n [\xe2\x80\xa6]\n }\n [\xe2\x80\xa6]\n }\nRun Code Online (Sandbox Code Playgroud)\n\n据我了解,所有计算为 \xc2\xbbfalse\xc2\xab ( 0) 的内容都会导致evdev_ungrab( (void*)0, 0, \xe2\x80\xa6) ,所有 \xc2\xbbtrue\xc2\xab (不是0) 的内容都会导致evdev_grab( (void*)1, 1,0xDEADBEEF \xe2\x80\xa6)。
值得一提的是你的第一个例子,
\n\nint grab = 1;\nioctl(fd, EVIOCGRAB, &grab);\n..\nioctl(fd, EVIOCGRAB, NULL); \nRun Code Online (Sandbox Code Playgroud)\n\n仅在无意中起作用。这不是内部的值,而是非零的grab事实(您可能已经猜到了这一点,因为反例不是但&grabgrab = 0; ioctl(\xe2\x80\xa6, &grab);ioctl(\xe2\x80\xa6, NULL);。有趣。:)
| 归档时间: |
|
| 查看次数: |
5538 次 |
| 最近记录: |