XOpenDisplay从udev事件失败

时间:2010-12-09 01:39:47

标签: xlib udev

我试图像这样打开X显示器:

disp = XOpenDisplay(NULL);

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

有谁知道为什么会这样?

1 个答案:

答案 0 :(得分:1)

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

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

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

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