Когда X запускается, он ищет самый низкий неиспользованный VT и присоединяется к нему. Моя проблема в том, что когда есть несколько запущенных X-процессов, мне нужно иметь возможность определить, какой из них является активным в данный момент.
Это вопрос * BSD, потому что в Linux это просто: X устанавливает свой управляющий терминал ttyN
или, в очень старых дистрибутивах, он задается в командной строке как vtN
. Итак, я запускаю службу и вижу, что в настоящее время активен VT tty7
, и работают два X-сервера, легко определить, какой из них соответствует текущему терминалу. (Это разумный случай: возможно, пользователь использовал функциональность GNOME / KDE «переключить пользователя» или запустил два сервера с помощью startx
.) Пример приложения, которое может захотеть следовать за активным X-сервером, x11vnc
(которое разветвлено из разрабатываемого мной программного обеспечения). ).
На FreeBSD управляющий терминал ничего вам не говорит. Когда X запускается с ttyv1, он остается управляющим терминалом.
Обновить
Я сделал должную осмотрительность и прочитал X-код. После некоторой охоты вокруг, теперь мне понятнее, что происходит.
В lnx_init.c X-сервер создает setsid
новый сеанс для себя, а затем открывает fd ttyN
сразу после выполнения VT_ACTIVATE
ioctl. Довольно стандартный; открытие fd для терминала без управляющего процесса из процесса без управляющего терминала связывает два, и сервер сохраняет открытый fd, поэтому гарантируется, что терминал останется управляющим терминалом для X-сервера.
Теперь в bsd_init.c открытие fd для tty, которое будет использоваться в качестве кадрового буфера, не делает его управляющим терминалом (и фактически, при отсутствии setsid
BSD Xserver, запущенный с xinit
ttyv2, будет хранить ttyv2 в качестве своего ctty!).