私はXのようなシステムがどのように機能するか(概念的に)よりよく理解しようとしています。私が理解しているように、Xはキーボードイベントを受信するためにブロック読み取りを実行する内部イベントループを持っています/dev/input/event0
。次に、そのイベントを取得し(ユーザースペースで)いくつかの処理を実行し、ある種のイベントキュー形式を使用してアクティブウィンドウに渡します。これが本質的にどのように機能するか誤解している場合は訂正してください。
しかし、これが私が混乱する場所です。 Xから/dev/input/event0
またはをeventXX
直接読み込み、したがってこれらのイベントが消費された場合に他のプロセスに読み取り操作を実行させるにはどうすればよいですかeventXX
? Pythonプロセスにデバイスからデータを読み取る、コマンドラインからデータを読み取るなどのタスクを実行させることができます。
私の理解(そしてこれが私が間違っている可能性がある)は、文字デバイスの出力が単一のプロセスによって消費されるため、2つのプロセスが呼び出されると、呼び出しのread
1/dev/...
つだけが指定されたデータを返すことです。read
もしそうなら、Xが文字デバイスからすべてのデータを取得すると、他のプロセスはどのように同じキーボードデータを読み取ることができますか?
ベストアンサー1
Xorgと他のプログラム共有I/Oデバイスのネゴシエーション。 2つのモードで動作します。有効にすると、入力デバイスkevent(…EV_ENABLE…)
またはファイル記述子のための同様のデバイスをポーリングしてディスプレイデバイスに書き込みます。非アクティブ状態では、入力デバイスをポーリングしないか、ファイル記述子kevent(…EV_DISABLE…)
に同様のデバイスを使用せず、ディスプレイデバイスに書き込みません。
特定の時間に1つのプログラムだけがI / Oデバイスにアクセスできます。観察したように、複数のプログラムでこれを行うと、ディスプレイが破損し、個々の入力イベントがどこで終わるのかわからないからです。 (Linuxに組み込まれた端末エミュレータはここではプログラムと見なされます。プロセス。ポーリングを使用する代わりに、入力デバイスドライバに内部フックがあり、入力ストリームの開閉を制御し、更新された文字単位を表示デバイスに実装する必要があるときに通知するフラグがあるため、同じ効果が得られます。 )
彼らカーネル仮想端末交渉の手段として。これがXorgサーバーがKVTを展開する理由です。プロセスに信号を理解し送信するための対応するタイプのデバイスのみを含むKVTデバイス固有のプロトコルを使用すると、ioctl()
各デバイスはディスプレイとHID(人間入力デバイス)の責任を負う時期とカーネルの使用時期を交渉できます。 。内蔵ターミナルエミュレータまたは他のいくつかのプログラム(他のXサーバーを含む)。
logind
このアイデアは、完全に独立したセカンダリディスプレイなど、KVTサブシステムで使用されていないI / Oデバイス用のコラボレーションプログラム間の同じネゴシエーションを許可するか、最初にLinuxがない場合はsystemdプログラムで再作成されました。 。同じ原則が適用されます。ファイル記述子は、プログラムが非アクティブのときはプログラムで使用されません。
追加読書
- https://unix.stackexchange.com/a/489983/5132
- https://unix.stackexchange.com/a/178807/5132
- デビッド・ハーマン(2013-08-24)。 強力なセッション切り替え。 dvdhrm.wordpress.com.
- Seat0 にディスプレイサーバがない場合、Seat0 以外のすべての入力デバイスが VT に漏れます。。システムエラー#15387。 2020年4月10日。