0

我正在尝试像这样打开 X 显示器:

disp = XOpenDisplay(NULL);

当我从我的用户 shell 运行它时,它工作正常,但如果它从 udev 事件(Ubuntu 10.10)运行,则函数调用返回 NULL。我想知道这是否与不同的环境有关,所以也尝试过 XOpenDisplay(":0.0") 但无济于事。

有谁知道为什么会这样?

4

1 回答 1

1

XOpenDisplay(NULL)将检查DISPLAY环境变量,该变量通常未在 udev 上下文中设置。为了能够使用XOpenDisplay(something)(包括something=NULL),您需要 X 服务器实例的访问密钥。

XAUTHORITY如果您想使用XOpenDisplay或任何使用它的图形程序,环境变量将被设置为密钥文件的位置。如果此 env var 为空,~/.Xauthority则用作后备。

尝试从 udev 启动一些图形程序是一个坏主意(阅读:您的方法和设计有问题):您不知道 X 显示编号。您也无法猜到,因为可能有不止一个 X 服务器处于活动状态。然后你需要有它的密钥文件,这并不总是可以确定或获得。udev 可以以 root 身份运行,但有些东西是 NFS 挂载root_squash,以及XAUTHORITY人们可以用来重定位其密钥文件的变量。

如今图形问题的工作方式是用户或他/她正在使用的桌面环境必须启动一个专门监听某些事件的后台程序。只是为了让您不能简单地侵入人们的屏幕,而必须遵守他们的事件通知系统。

于 2010-12-09T03:04:52.177 回答