1

コンソールに接続されている X サーバー、つまり現在マウス/キーボード/スクリーンによって制御されている X サーバーをプログラムで見つけたいと考えています。現在の vt を取得するクリーンな方法があると仮定しました ( /dev/console? を使用)。fgconsole コード(fgconsole.c、getfd.c) には少し疑問が残りました。その間

struct vt_stat vtInfo;
ioctl(fdConsole, VT_GETSTATE, &vtInfo);

有効なコンソール fd を取得するコードはやや信頼性が低いようです - 5 つのファイルがテストされていますが (それぞれ rw/w/r)、端末エミュレーション (xterm) 内で呼び出されると失敗します。私はおそらくそれで暮らすことができますが、それは本当に気分が良くありません... (注: もちろん、xterm をコンソールにすることはできません。xterm 内で fgconsole を照会することについて話しているのです)。

次に、vt (vt7 など) を X ディスプレイにマップする必要があります。しかし、私はむしろ依存したくありません

ps aux | grep X

それを達成するために...もっと信頼できる方法はありますか? にリストされているすべての X サーバーに接続して、/tmp/.X11-unix/それらの vt について尋ねることはできますか? または、コンソールに接続された (「アクティブ」) 状態を直接取​​得しますか? おそらくXサーバーAPIがvtsに依存しないため、Xlibでそれを行う明白な方法を見つけることができませんでしたが、おそらくこれには拡張機能がありますか?

助けてくれてありがとう!

4

1 に答える 1

0

/proc fsが好きです :) 必要なものはすべて揃っているようです。私はまだこれを C コードにキャストしていませんが、うまくいくはずです:

  • /tmp/.X11-unix/で開いている X ディスプレイ (およびその名前 (例: :0 )) を探します。
  • /proc/net/unixでこれらのソケットを探し、その inode を取得します
  • vt が開いているプロセスを/proc/[PID]/で探しますls -la /proc/*/fd/ | grep /dev/tty。もちろん、/proc/[PID]/exeは役に立ちますが、信頼性が低くなる可能性があります。

の出力は、フォームのソケットとフォームの多くcat /proc/net/unix | grep -a '/tmp/.X11-unix/X'が常に存在することを示唆しています(@ に注意してください)。前者をリッスンしているプロセス (X サーバー) が常に 1 つだけ存在するというのは、保存された仮定なのだろうか。/tmp/.X11-unix/X0@/tmp/.X11-unix/X0

于 2012-08-30T12:40:54.233 に答える