マウス

マウスも当然ファイルとして抽象化されている.UNIXなら/dev/mouse*とか,/dev/mse*に相当する.mouseをcatすれば,ポインタの状態を得ることができる.ここまでは一緒だ.これをウィンドウシステムがどのようにプロセス(もしくはプログラマ)に見せるか,という点はX Window Systemrio(Plan9のウィンドウシステム)の思想の違いが反映されていて面白い.GUI環境では,同時に複数のウィンドウを開くことができるが,(単純に考えて)ウィンドウごとにプロセスが走っているので,複数のプロセスから一つのマウスというデバイスを見せるために,デバイスを多重化する必要がある.
Xなどの一般的なウィンドウシステムは何らかのイベント機構を用意して,ウィンドウ上でマウスポインタが操作されたら,該当するウィンドウのプロセスにイベントのメッセージを投げるようになっている.
rioは,プロセスごとに/dev/mouseを持っているかのように見せかけている.例えば,二つのウィンドウを開き,それぞれで"cat /dev/mouse"を実行する.すると,ポインタがどちらかのウィンドウ上に移動したときに,そのウィンドウで実行されているcatだけが/dev/mouseの内容を出力する.なるほどプロセスごとに名前空間を持てるからこその実装だな.格好いい.次は,この辺の仕組みを追っかけてみよう.

ちなみに,cat /dev/mouseを実行したウィンドウ上でマウスを動かすと,mから始まる次のような文字列が出力される.順にX座標,Y座標,ボタンの状態,タイムスタンプを示している.

m        102        156          0      49250