gpt4 book ai didi

c - 获取前台控制台/查找事件的 X 服务器

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:38:24 26 4
gpt4 key购买 nike

我想以编程方式找到连接到控制台的 X 服务器,这意味着当前由鼠标/键盘/屏幕控制。我假设有一种干净的方法来获取当前 vt(使用 /dev/console?)。 fgconsole code (fgconsole.c, getfd.c) 让我有点怀疑。而

struct vt_stat vtInfo;
ioctl(fdConsole, VT_GETSTATE, &vtInfo);

似乎是我想要的,检索有效控制台 fd 的代码似乎有些不可靠 - 尽管测试了 5 个文件(每个文件都读/写/读),但如果在终端仿真 (xterm) 中调用它仍然会失败。我可能可以忍受,但它真的感觉不太好......(注意:当然 xterm 不能是控制台 - 我们正在谈论在 xterm 中查询 fgconsole)。

接下来,我必须将 vt(例如 vt7)映射到 X 显示器。但是,我宁愿不依赖

ps aux | grep X

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

感谢您的帮助!

最佳答案

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

关于c - 获取前台控制台/查找事件的 X 服务器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12181820/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com