我正在尝试像这样打开 X 显示器:
disp = XOpenDisplay(NULL);
当我从我的用户 shell 运行它时,它工作正常,但如果它从 udev 事件(Ubuntu 10.10)运行,则函数调用返回 NULL。我想知道这是否与不同的环境有关,所以也尝试过 XOpenDisplay(":0.0") 但无济于事。
有谁知道为什么会这样?
XOpenDisplay(NULL)
将检查DISPLAY
环境变量,该变量通常未在 udev 上下文中设置。为了能够使用XOpenDisplay(something)
(包括something=NULL
),您需要 X 服务器实例的访问密钥。
XAUTHORITY
如果您想使用XOpenDisplay
或任何使用它的图形程序,环境变量将被设置为密钥文件的位置。如果此 env var 为空,~/.Xauthority
则用作后备。
尝试从 udev 启动一些图形程序是一个坏主意(阅读:您的方法和设计有问题):您不知道 X 显示编号。您也无法猜到,因为可能有不止一个 X 服务器处于活动状态。然后你需要有它的密钥文件,这并不总是可以确定或获得。udev 可以以 root 身份运行,但有些东西是 NFS 挂载root_squash
,以及XAUTHORITY
人们可以用来重定位其密钥文件的变量。
如今图形问题的工作方式是用户或他/她正在使用的桌面环境必须启动一个专门监听某些事件的后台程序。只是为了让您不能简单地侵入人们的屏幕,而必须遵守他们的事件通知系统。