我在哪里可以找到记录的 ioctl EVIOCGRAB?

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)

我希望EVIOCGRABioctl_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控制参数的明确解释呢?

And*_*ese 4

您至少可以在内核源代码中找到明确的解释,更具体地说drivers/input/evdev.c,更具体地说:

\n\n
 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 }\n
Run 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\n

值得一提的是你的第一个例子,

\n\n
int grab = 1;\nioctl(fd, EVIOCGRAB, &grab);\n..\nioctl(fd, EVIOCGRAB, NULL); \n
Run Code Online (Sandbox Code Playgroud)\n\n

仅在无意中起作用。这不是内部的值,而是非零的grab事实(您可能已经猜到了这一点,因为反例不是但&grabgrab = 0; ioctl(\xe2\x80\xa6, &grab);ioctl(\xe2\x80\xa6, NULL);。有趣。:)

\n