获取前台控制台/查找活动X服务器

时间:2012-08-29 15:51:04

标签: c linux console xorg xserver

我想以编程方式找到连接到控制台的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无关,但可能有一个扩展名吗?

感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

我喜欢 / proc fs :)它似乎提供了我需要的一切。我还没有将它转换为C代码,但这应该工作得很好:

  • /tmp/.X11-unix /
  • 中查找打开的X显示(及其名称,例如:0
  • / proc / net / unix 中查找这些套接字,获取它们的inode
  • 查找 / proc / [PID] / 中有vt open的进程: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服务器)监听前者。