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)しかし、それは真実ではありません。
だから私はしません。知るこの関数の3番目のパラメータは何ですか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
ㅏ明確な少なくともカーネルソースコードで詳細な説明を見つけることができます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
で評価されるすべては ( , , ... ) になります。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);