получить консоль переднего плана/найти активный 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 не может быть консолью - мы говорим о запросе fgconsole внутри xterm).

Затем мне нужно будет сопоставить vt (например, vt7) с X-дисплеем. Однако я бы предпочел не полагаться на

ps aux | grep X

для этого... Есть ли более надежный способ? Могу ли я подключиться ко всем X-серверам, перечисленным в /tmp/.X11-unix/, и спросить их об их vt? Или даже напрямую получить их состояние «подключено к консоли» («активно»)? Я не смог найти очевидный способ сделать это с помощью Xlib, вероятно, потому, что API-интерфейс X-сервера не зависит от vts, но, может быть, для этого есть расширение?

Спасибо за любую помощь!


person Daniel S    schedule 29.08.2012    source источник


Ответы (1)


Мне нравится /proc fs :) Кажется, он предоставляет все, что мне нужно. Я еще не преобразовал это в код C, но это должно работать довольно хорошо:

  • найдите открытые дисплеи X (и их имена, например, :0) в /tmp/.X11-unix/
  • найдите эти сокеты в /proc/net/unix, получите их иноды
  • ищите процессы в /proc/[PID]/, у которых открыт vt: ls -la /proc/*/fd/ | grep /dev/tty - если у них также есть один из индексных дескрипторов сокета в их дескрипторах открытых файлов, они должны быть X-сервером, иначе телетайп Конечно, /proc/[PID]/exe помогает, но может быть менее надежным.

Вывод cat /proc/net/unix | grep -a '/tmp/.X11-unix/X' предполагает, что всегда есть сокет формы /tmp/.X11-unix/X0 и многие формы @/tmp/.X11-unix/X0 (обратите внимание на @). Интересно, является ли предположение сохранения, что всегда есть только один процесс (X-сервер), прослушивающий первый.

person Daniel S    schedule 30.08.2012