Когда 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_ACTIVATEioctl. Довольно стандартный; открытие fd для терминала без управляющего процесса из процесса без управляющего терминала связывает два, и сервер сохраняет открытый fd, поэтому гарантируется, что терминал останется управляющим терминалом для X-сервера.
Теперь в bsd_init.c открытие fd для tty, которое будет использоваться в качестве кадрового буфера, не делает его управляющим терминалом (и фактически, при отсутствии setsidBSD Xserver, запущенный с xinitttyv2, будет хранить ttyv2 в качестве своего ctty!).