これは主に好奇心に由来するものです。私は低レベルでイベント処理がどのように機能するかを理解しようとしていますので、これを行うことができるソフトウェアをお勧めしません。
たとえば、マウスクリックに反応するC / C ++プログラムを作成するには、システムコールを使用して一部の機能をカーネルに関連付ける必要があるか、マウスの状態を継続的に確認する必要があります。わかりません。
C / C ++では、ほとんどすべてが可能であるため可能であると考えており、レベルが低すぎるため、どのように動作するかに最も興味がありますが、直接実装する必要はありません。
問題は、Linuxでどのように機能するのか、特定のシステムコール、Cライブラリなどがありますか?
答え1
Linuxでマウスを使用する実際のプログラムを書く場合、Xアプリケーションを書く可能性が高くなります。この場合、Xサーバーにマウスイベントを要求する必要があります。 Qt、GTKとライブラリファイルGUIプログラムの作成に必要なマウス、キーボード、グラフィック、タイマー、その他の機能へのアクセスを提供する広く使用されているCライブラリ。 Ncurses同様の端末アプリケーションライブラリです。
ただし、システムをブラウズしている場合、または何らかの理由でXを使用できない場合、カーネルインターフェースでXがどのように機能するかは次のとおりです。
UNIXの哲学の重要なアイデアは、「すべてがファイルです」です。具体的には、ファイルの処理に使用されるのと同じシステムコールを介してできるだけ多くのコンテンツにアクセスする必要があります。したがって、マウスのカーネルインタフェースはデバイスファイルです。open()
電話をかけたりpoll()
、select()
着信データがあることを確認したり、read()
データを読み取ったりできます。
USB時代以前は、特定のデバイスファイルは通常シリアルポート(/dev/ttyS0
PS / 2ポートなど)でした/dev/psaux
。マウスに組み込まれているハードウェアプロトコルを使用してマウスと通信できます。今日/dev/input/*
、サブシステムは、さまざまな入力デバイスを処理するための統合されたデバイスに依存しない方法を提供するために好まれています。特に、/dev/input/mice
システムに接続されているすべてのマウスのイベントが提供され、/dev/input/mouseN
特定のマウスのイベントも提供されます。ほとんどの最新のLinuxディストリビューションでは、マウスを接続するとこれらのファイルが動的に生成されます。
マウスデバイスファイルから読み書きする内容の詳細については、次を参照してください。入力/input.txtカーネル文書から。具体的には、セクション3.2.2(mousedev)と3.2.4(evdev)とセクション4と5を参照してください。
答え2
通常、ハードウェアデバイスの情報は、次のようにアプリケーションに公開されます。デバイスファイル。マウスの場合、最新のLinuxシステムでは、このデバイスは次のとおりです/dev/mice
(このデバイスは、接続されているすべてのマウスのイベントを収集し、個々のマウスに対応するデバイスもあります)。
マウスを移動またはクリックすると、マウスがコンピュータに電気信号を送信してコンピュータ邪魔する。 Linuxカーネルのコードスニペットは次のとおりです。割り込みハンドライベントデータは順次読み込まれ(たとえば、ボタンが押されたときなど)、カーネル内で一連の通知をトリガーします。
アプリケーションがこのデバイスに対応するデバイスファイルを読み取っている場合、入力が保留中であるという通知がアプリケーションに渡されます。たとえば、アプリケーションが次からブロックされている場合read
システムコール、その後、システムコールが返されます。
一般的なシステムには、マウスイベントを読み取るプロセスがあります。X Windowsサーバー。このプログラムは、グラフィックディスプレイと入力周辺機器を管理します。その後、各グラフィックアプリケーションは通常のXイベントプロトコルを介してマウスイベントに関する通知を受け取ります。このプロトコルは、キーの押下、ウィンドウのフォーカスの変更、ウィンドウの可視性の変更などの他のイベントの種類を渡します。