c - 从守护进程运行时 XOpenDisplay 失败(C 语言)

标签 c linux daemon xserver idle-timer

我正在我的树莓派上做一个简单的项目,它在某些系统事件(如磁盘读取、以太网通信、处理器过载)上以不同的方式闪烁一些 LED,并且这些 LED 需要在一段时间后关闭系统处于空闲状态(当未检测到系统事件时,这些 LED 将改变其强度)。

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

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

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

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

最佳答案

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

检测 X 图形界面之外的系统不活动(空闲),只是通过监视/proc/interrupt 上的 IRQ(通常是 IRQ 1/IRQ 12)或更简单(支持其他 USB 输入,例如甚至操纵杆!)通过监视“软中断”行上的/proc/stat,第二个数字列包含当这些设备有某些/任何输入(鼠标移动或按下/释放按键)时传输的字节数

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

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

关于c - 从守护进程运行时 XOpenDisplay 失败(C 语言),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41253266/

相关文章:

c - scanf 没有正确存储输入

linux - CSS 正在生成但未保存

c - 为什么要在守护程序启动期间将 STDIN、STDOUT、STDERR 重定向到/dev/null?

macos - 通过 XPC 与应用程序通信并启动以 root 身份运行的守护进程

c - 创建一个读取(字符串)输入的函数

c - 为什么 waitpid() 对所有子进程只返回 1?

android - 在CCTools Android中编译两个文件(已安装GCC Addon)

c - 如何在procfs中执行顺序读取?

linux - 通过 Docker 调用 OCRmyPDF 的 bash 脚本的错误响应

java - 可以将 main() 转换为守护线程