当 运行 来自守护程序时 XOpenDisplay 失败(C 语言)

XOpenDisplay fails when run from daemon (C language)

我在 raspberry pi 上的一个简单项目中工作,在某些系统事件(如磁盘读取、以太网通信、处理器过载)上以不同方式闪烁一些 LED,并且这些 LED 需要在系统闲置一段时间后关闭(当未检测到系统 activity 时,这些 LED 将表现出不同的强度)。

为了实现空闲检测,我使用了XScreenSaver,直到这里,一切都完美无缺。

由于我的项目需要作为守护程序执行 (etc/init.d) 并且需要 运行 具有 root 权限(因为 pigpio 库)与 X Server 的通信(通过 XOpenDisplay)是每次都返回 NULL,即使系统准备就绪并处于图形界面。在终端上,运行手动执行此操作,一切正常。

根据我的研究,我了解到在启动时没有可用的控制台时无法访问 X Server,并且出于安全原因无法访问它。

所以我问,我如何以最简单的方式实现这一点(检测空闲时间)? (我尝试过自我重启,尝试在启动脚本上设置 DISPLAY 变量,但似乎没有任何效果。)我是 linux 开发的新手,不知道如何正确解决这个问题。

只是回答我自己的问题,如果有人和我有同样的问题。

Detecting System Inactivity (Idle) outside X graphical interface, is just a matter of USB Keyboard / mouse activity 通过在 /proc/interrupt 或更简单(支持其他 USB 输入,甚至是操纵杆!)通过监视 "softirq" 行上的 /proc/stat,第二个数字列包含当这些设备有一些/任何输入时传输的字节数(鼠标移动或按键按下/释放)

这在 C 中有时很容易实现,fopen/fread 这些字段将值与旧值进行比较。

非常感谢我对 Linux 内部结构和用户 Olaf 的深入研究,他们在发现显而易见的事物方面拥有丰富的知识。