Quando o X inicia, ele procura o VT mais baixo não utilizado e o anexa a ele. Meu problema é que, quando há vários processos X em execução, preciso identificar qual é o atualmente ativo.
Esta é uma pergunta * BSD, porque no linux é fácil: X define seu terminal de controle ttyN
ou, em distribuições muito antigas, é especificado na linha de comando como vtN
. Portanto, estou executando um serviço e vejo que o VT atualmente ativo está tty7
e há dois servidores X em execução, é fácil saber qual deles corresponde ao terminal atual. (Este é um caso razoável: talvez o usuário tenha usado a funcionalidade 'switch user' do GNOME / KDE ou tenha executado dois servidores usando startx
). Um exemplo de aplicativo que pode querer seguir o servidor X ativo é x11vnc
(que é bifurcado do software que estou desenvolvendo). )
No FreeBSD, porém, o terminal de controle não diz nada. Quando o X é iniciado a partir de ttyv1, esse permanece o terminal de controle.
Atualizar
Fiz a devida diligência e li o código X. Depois de alguma caçada, agora está mais claro para mim o que está acontecendo.
No arquivo lnx_init.c , o servidor X faz setsid
uma nova sessão para si próprio e, em seguida, abre um fd para ttyN
logo depois para VT_ACTIVATE
executar um ioctl nele. Bastante padrão; abrir o fd para um terminal sem processo de controle de um processo sem terminal de controle associa os dois, e o servidor mantém o fd aberto, por isso é garantido que o terminal continuará sendo o terminal de controle do servidor X.
Agora, em bsd_init.c , abrir o fd para o tty para ser usado como o framebuffer não o torna um terminal de controle (e, de fato, sem ele setsid
, o BSD Xserver iniciado xinit
no ttyv2 manterá o ttyv2 como seu ctty!).