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中,向要用作帧缓冲区的tty打开fd并不能使其成为控制终端(实际上,如果没有setsid
,则从xinit
ttyv2 启动的BSD Xserver 会将ttyv2保留为其ctty!)。