Lorsque X démarre, il recherche le VT inutilisé le plus bas et s'y attache. Mon problème est que lorsqu'il y a plusieurs processus X en cours d'exécution, je dois être en mesure d'identifier celui qui est actuellement actif.
C'est une question * BSD, car sur linux c'est facile: X définit son terminal de contrôle pour être ttyN
, ou, sur les très anciennes distributions, il est spécifié sur la ligne de commande comme vtN
. Donc, j'exécute un service et je vois que le VT actuellement actif est tty7
, et qu'il y a deux serveurs X en cours d'exécution, il est facile de dire lequel correspond au terminal actuel. (C'est un cas raisonnable: peut-être que l'utilisateur a utilisé la fonctionnalité de changement d'utilisateur de GNOME / KDE ou a exécuté deux serveurs à l'aide startx
.) Un exemple d'application qui pourrait vouloir suivre le serveur X actif est x11vnc
(qui est issu du logiciel que je développe ).
Sur FreeBSD cependant, le terminal de contrôle ne vous dit rien. Lorsque X est démarré à partir de ttyv1, cela reste le terminal de contrôle.
Mise à jour
J'ai fait preuve de diligence raisonnable et j'ai lu le code X. Après avoir chassé, il est maintenant plus clair pour moi ce qui se passe.
Dans lnx_init.c , le serveur X setsid
effectue une nouvelle session pour lui-même, puis ouvre un fd ttyN
juste après pour faire un VT_ACTIVATE
ioctl dessus. Assez standard; l'ouverture du fd à un terminal sans processus de contrôle à partir d'un processus sans terminal de contrôle associe les deux, et le serveur garde le fd ouvert, il est donc garanti que le terminal restera le terminal de contrôle pour le serveur X.
Maintenant, dans bsd_init.c , ouvrir le fd au tty à utiliser comme framebuffer n'en fait pas un terminal de contrôle (et en fait, sans setsid
, BSD Xserver démarré à partir xinit
de ttyv2 gardera ttyv2 comme ctty!).