Xが起動すると、Xは未使用の最低のVTを検索し、それにアタッチします。私の問題は、実行中のXプロセスが複数ある場合、現在アクティブなプロセスを特定できるようにする必要があることです。
これは* BSDの質問です。Linuxでは簡単です。Xは制御端末をに設定するttyN
か、非常に古いディストリビューションでは、コマンドラインでと指定されていvtN
ます。したがって、サービスを実行していて、現在アクティブなVTがtty7
であり、2つのXサーバーが実行されていることがわかります。どちらが現在の端末に対応するかは簡単にわかります。(これは合理的なケースです:おそらく、ユーザーはGNOME / KDEの「ユーザー切り替え」機能を使用したか、を使用して2つのサーバーを実行しましたstartx
。)アクティブなXサーバーをフォローしたいアプリケーションの例はx11vnc
(私が開発しているソフトウェアから分岐したものです) )。
ただし、FreeBSDでは、制御端末は何も通知しません。Xがttyv1から起動されると、制御端末のままになります。
更新
私はデューデリジェンスを行い、Xコードを読みました。探し回った後、何が起こっているのかがはっきりしました。
でlnx_init.c、Xサーバが行いsetsid
、その後にFD開き、自身のために新鮮なセッションを作るためにttyN
行うにストレートの後にVT_ACTIVATE
、その上のioctl。かなり標準的です。制御端末のないプロセスから端末にfdを開くと、その2つが関連付けられ、サーバーはfdを開いたままにするため、端末がXサーバーの制御端末として残ることが保証されます。
現在、bsd_init.cで、フレームバッファーとして使用するためにttyにfdを開いても、制御端末にはなりません(実際には、なしのsetsid
場合、xinit
ttyv2 から起動したBSD Xserverはttyv2をcttyとして保持します!)。