web-dev-qa-db-ja.com

/ dev / input-これは正確には何ですか?

ハードウェアとOSの相互作用に興味があり、この投稿に出くわしました キーボード入力とテキスト出力はどのように機能しますか?

多くの魔法が/ dev/inputディレクトリで起こっているようです。私は自分のOS(Ubuntu 16.10)を調べて、何がわかるかを確認することにしました。これらのファイルはすべて0バイトとしてリストされており、Sudo cat mouse0 | hexdump -Cを実行すると、次のような大量の16進データが表示されます。

00000000  b3 82 8a 58 00 00 00 00  53 74 09 00 00 00 00 00  |...X....St......|
00000010  01 00 1c 00 00 00 00 00  b3 82 8a 58 00 00 00 00  |...........X....|
00000020  53 74 09 00 00 00 00 00  00 00 00 00 00 00 00 00  |St..............|
00000030  b6 82 8a 58 00 00 00 00  06 56 0e 00 00 00 00 00  |...X.....V......|
00000040  01 00 10 00 01 00 00 00  b6 82 8a 58 00 00 00 00  |...........X....|
00000050  06 56 0e 00 00 00 00 00  00 00 00 00 00 00 00 00  |.V..............|

だから私はいくつかの質問があります:

  1. このファイルの目的は何ですか?これらのデバイスファイルは、カーネルからXサーバーにスキャンコードを転送する仲介者としてのみ使用されているようです。カーネルからXサーバーに直接送信しないのはなぜですか?

  2. なぜそんなにたくさんあるのですか? 20個を超える個別のイベントファイルがありますが、キーボードとマウスは1つだけです。

11
Astrum

質問は逆の順序で行います。

  1. なぜそんなにたくさんあるのですか?

これらは、マシンに存在するほとんどの入力を表すデバイスです(他にもあります。たとえば、マイクは/dev/inputで管理されません)。 1つのキーボードと1つのマウスで2つのデバイスが提供されるという想定とは逆に、最も単純なキーボードとマウスでも、6つのデバイスが提供されます。

なぜ6? Xorgは起動時にテスト入力キーボードとテスト入力マウス(両方とも仮想)を作成するためです。また、テストキーボードと実際のキーボードをメインの仮想デバイスに集約します。つまり、入力の多重化を実行します。同じことがテストと実際のマウスに起こります。

さらに、一般的なコンピューター(デスクトップまたはラップトップ)には、キーボード以外に電源ボタン、スリープボタンなどのボタンがあります。

そこにあるeventNデバイスには、Xorgが作成したものとコンピューターが持っているもののためのデバイスがあります。 NはシーケンシャルIDから取得され、xinputのIDに類似しています。たとえば、私のマシンでは:

[~]# ls -l /dev/input/
total 0
drwxr-xr-x 2 root root     100 Jan 26 16:01 by-id
drwxr-xr-x 2 root root     140 Jan 26 16:01 by-path
crw-rw---- 1 root input 13, 64 Jan 26 16:01 event0
crw-rw---- 1 root input 13, 65 Jan 26 16:01 event1
crw-rw---- 1 root input 13, 74 Jan 26 16:01 event10
crw-rw---- 1 root input 13, 75 Jan 26 16:01 event11
crw-rw---- 1 root input 13, 76 Jan 26 16:01 event12
crw-rw---- 1 root input 13, 77 Jan 26 16:01 event13
crw-rw---- 1 root input 13, 66 Jan 26 16:01 event2
crw-rw---- 1 root input 13, 67 Jan 26 16:01 event3
crw-rw---- 1 root input 13, 68 Jan 26 16:01 event4
crw-rw---- 1 root input 13, 69 Jan 26 16:01 event5
crw-rw---- 1 root input 13, 70 Jan 26 16:01 event6
crw-rw---- 1 root input 13, 71 Jan 26 16:01 event7
crw-rw---- 1 root input 13, 72 Jan 26 16:01 event8
crw-rw---- 1 root input 13, 73 Jan 26 16:01 event9
crw-rw---- 1 root input 13, 63 Jan 26 16:01 mice
crw-rw---- 1 root input 13, 32 Jan 26 16:01 mouse0
crw-rw---- 1 root input 13, 33 Jan 26 16:01 mouse1

そしてxinputは類似のIDを私に与えます:

[~]$ xinput list
⎡ Virtual core pointer                      id=2    [master pointer  (3)]
⎜   ↳ Virtual core XTEST pointer                id=4    [slave  pointer  (2)]
⎜   ↳ Logitech USB Optical Mouse                id=10   [slave  pointer  (2)]
⎜   ↳ SynPS/2 Synaptics TouchPad                id=14   [slave  pointer  (2)]
⎣ Virtual core keyboard                     id=3    [master keyboard (2)]
    ↳ Virtual core XTEST keyboard               id=5    [slave  keyboard (3)]
    ↳ Power Button                              id=6    [slave  keyboard (3)]
    ↳ Video Bus                                 id=7    [slave  keyboard (3)]
    ↳ Power Button                              id=8    [slave  keyboard (3)]
    ↳ Sleep Button                              id=9    [slave  keyboard (3)]
    ↳ USB 2.0 Camera                            id=11   [slave  keyboard (3)]
    ↳ Asus Laptop extra buttons                 id=12   [slave  keyboard (3)]
    ↳ AT Translated Set 2 keyboard              id=13   [slave  keyboard (3)]

eventNid=Nに対応していることを確認してください)

Xorgなし

1.1このファイルの目的は何ですか?

すべてのランダム入力(USBカメラを含む!)は仮想キーボードの一部としてXorgに表示されることに注意してください。これにより、入力の多重化と逆多重化が可能になります。たとえば、USBマウスまたはトラックパッドを使用してマウスを移動できますが、アプリケーションが違いを認識する必要はありません。

(USBカメラが仮想キーボードの一部であるのは、オンとオフを切り替えるボタンがあるためです。そして、aはボタンなので、キーボードサブシステムの一部になります。実際のビデオ入力は、/sys/class/video4linuxで処理されます。)

つまり、アプリケーションの場合、実際にはキーボードとマウスは1つだけです。しかし、Xorgとカーネルの両方が違いを知る必要があります。そして、これは最後の部分につながります:

1.2カーネルからXサーバーに直接送信しないのはなぜですか?

Xorgは違いを知る必要があるからです。

そして、それが役立つ状況があります。 Xorgのキーを各スレーブ入力デバイスに別々に再マッピングできます。たとえば、私はペダル付きのゲームセットを持っていますが、それをレーシングゲームで使用すると、 a、 b そして c ペダルごとに。しかし、プログラミング時にこれらのキーを Esc、 Ctrl そして Alt、キーボード自体のキーを再マッピングすることなく。

また、マシンがXorgを実行している必要はありません。たとえば、ヘッドレスサーバーで次の出力を取得できます。

[~]$ ls -l /dev/input/
total 0
drwxr-xr-x 2 root root      80 Nov  8 02:36 by-path
crw-rw---- 1 root input 13, 64 Nov  8 02:36 event0
crw-rw---- 1 root input 13, 65 Nov  8 02:36 event1
crw-rw---- 1 root input 13, 66 Nov  8 02:36 event2

入力デバイスがキーボードやマウスではなくシリアルポート(この場合は特にそうです)に対応する場合。

15
grochmal

「直接送る」というものはありません。アプリケーションにはデータを読み取るためのいくつかの方法が必要です。UNIXでは、通常のファイルを操作するデバイスノードを作成することで通常のファイルを読み取るのと同じ方法で実行されますIOシステムコールでアプリケーションに開いて読んでください。

マウスとキーボード以外にも、他の入力ソースがあります。 /sys/class/inputを見ると、それぞれが何であるかがわかります。そこでは、それらが表すデバイスを記述するsysfs内の別のノードへのシンボリックリンクである同じinputNN名を持つファイルを細かくします。他の一般的なソースには、サウンドカード(プラグが差し込まれたり抜かれたときに信号を送る)やコンピューターの物理的な電源ボタンなどがあります。

2
psusi