我想以编程方式找到连接到控制台的X服务器,这意味着当前由鼠标/键盘/屏幕控制。
我假设有一种干净的方法来获取当前的vt(使用/dev/console
?)。 fgconsole
code(fgconsole.c,getfd.c)让我有点怀疑。
而
struct vt_stat vtInfo;
ioctl(fdConsole, VT_GETSTATE, &vtInfo);
似乎是我想要的,检索有效控制台fd的代码似乎有点不可靠 - 虽然测试了5个文件(每个rw / w / r),但如果在终端仿真(xterm)中调用它仍然会失败。我可以忍受这个,但它并不是真的感觉很好...... (注意:当然xterm不能作为控制台 - 我们正在讨论查询xterm中的fgconsole)。
接下来,我必须将vt(例如vt7)映射到X显示器。 但是,我宁愿不依赖
ps aux | grep X
要做到这一点......有更可靠的方法吗?
我可以连接到/tmp/.X11-unix/
中列出的所有X服务器并询问他们的vt吗?
或者甚至直接获得他们附加到控制台('活跃')的状态?我找不到一个明显的方法来使用Xlib,可能是因为X服务器API与vts无关,但可能有一个扩展名吗?
感谢您的帮助!
答案 0 :(得分:0)
我喜欢 / proc fs :)它似乎提供了我需要的一切。我还没有将它转换为C代码,但这应该工作得很好:
ls -la /proc/*/fd/ | grep /dev/tty
- 如果他们的open文件描述符中也有一个套接字inode,则应该是一个X服务器,否则是一个tty。当然, / proc / [PID] / exe 有帮助,但可能不太可靠。 cat /proc/net/unix | grep -a '/tmp/.X11-unix/X'
的输出表明,始终存在/tmp/.X11-unix/X0
形式的套接字和许多形式@/tmp/.X11-unix/X0
(请注意@)。我想知道这是一个保存假设,总是只有一个进程(X服务器)监听前者。