【问题标题】:get foreground console / find active X server获取前台控制台/找到活动的 X 服务器
【发布时间】:2012-08-29 15:51:04
【问题描述】:

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

感谢您的帮助!

【问题讨论】:

    标签: c linux console xorg xserver


    【解决方案1】:

    我喜欢 /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 服务器)在监听前者是否是一种节省的假设。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-12-03
      • 2011-12-22
      • 1970-01-01
      • 2011-04-21
      • 2021-09-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多