0

我正在开发一个小型服务器程序,该程序从网络接收数据并执行各种操作。其中一项操作是打开与系统上运行的 X 服务器的连接并模拟按键操作。当我的服务器从 X 内的终端启动时,这很好,但我希望我的程序在系统启动时作为系统服务启动,然后在客户端请求时与 X 通信。

XOpenDisplay(NULL)我遇到的基本问题是对不是从 X 内部启动的进程的调用失败。据我了解,我无法从 X 外部打开 X 显示器,因此我能想到的最佳解决方法是编写一个单独的程序,该程序在用户登录 X 时启动,等待信号或消息从服务器,然后执行请求的操作。如果此帮助程序未运行或由于某种原因失败,则可以假设服务器可以将错误发送回客户端是完全可以的。

所以问题:我上面描述的是最好的(虽然是混乱的)解决方案,还是有更好的方法?事实上,有没有一种从 X 外部打开 X 显示的方法?谢谢!

4

2 回答 2

3

“在 X 内部”只是DISPLAY设置环境变量的问题。您可以在任何地方执行此操作。

如果有问题的 X 服务器正在为不同的用户运行,您可能还需要处理身份验证令牌,例如Xauthority票证。

但是 - 对于您描述的用例,我强烈建议您运行您自己的 X 服务器进程,独立于系统的实际显示硬件。这可能是Xvnc如果您想以交互方式连接检查,或者简单的无头实现,或者Xvfb根本不需要显示缓冲区。这种方法还可以防止您的软件在用户登录和注销时需要重新启动,否则会出现这种情况。

于 2012-10-19T21:15:46.480 回答
1

可以从机器上运行的任何进程连接到 X 显示器 - 您需要设置DISPLAY变量来指示要连接到哪个 X 会话,并且可能需要正确的 XAuthority 令牌。

但是,对于您的情况,这将被视为“混乱”的解决方案,因为您基本上需要猜测显示编号并解决授权问题。您还必须处理当您的守护程序启动时 X 服务器尚未启动的情况,或者当您的守护程序运行时 X 服务器重新启动时(X 客户端库并非真正设计用于处理X 服务器离开并再次回来)。

“干净”的解决方案实际上是您建议的解决方法 - 在 X 会话中运行的客户端通过 UNIX 域套接字或类似连接到您的守护程序。

于 2012-10-19T21:45:16.777 回答