1

我想以编程方式找到连接到控制台的 X 服务器,这意味着当前由鼠标/键盘/屏幕控制。我假设有一种干净的方法可以获取当前的 vt(使用/dev/console?)。fgconsole 代码(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

做到这一点......有没有更可靠的方法?我可以连接到列出的所有 X 服务器/tmp/.X11-unix/并询问他们的 vt 吗?或者甚至直接获取他们的附加到控制台(“活动”)状态?我找不到使用 Xlib 的明显方法,可能是因为 X 服务器 API 与 vts 无关,但也许有一个扩展?

谢谢你的帮助!

4

1 回答 1

0

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

  • 在/tmp/.X11-unix/中查找打开的 X 显示(及其名称,例如:0
  • 在/proc/net/unix中查找这些套接字,获取它们的 inode
  • 在/proc/[PID]/中查找打开 vt的进程: ls -la /proc/*/fd/ | grep /dev/tty- 如果它们的打开文件描述符中还有一个套接字 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 服务器)在监听前者是否是一种节省的假设。

于 2012-08-30T12:40:54.233 回答