EVIOCGRABのioctlドキュメントはどこにありますか?

EVIOCGRABのioctlドキュメントはどこにありますか?

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で評価されるすべては ( , , ... ) になります。0evdev_grab(void*)110xDEADBEEF

最初の例に言及する価値があります。

int grab = 1;
ioctl(fd, EVIOCGRAB, &grab);
..
ioctl(fd, EVIOCGRAB, NULL); 

意図せず動作するだけです。これは価値ではありません~へしかし、grab実際にはゼロではありません(反例ではない&grabので、これを推測した可能性があります。興味深いです。)grab = 0; ioctl(…, &grab);ioctl(…, NULL);

関連情報