我使用XLib和XRand来获取有关嵌入式系统上连接的显示器的一些信息。
class Foo {
private:
Display *_display{};
public:
Foo() {
_display = XOpenDisplay(":0.0");
}
void getSomeInfo() const {
/* Get some info with _display */
}
~Foo() {
XCloseDisplay(_display);
}
}
问题是,在创建Foo实例之后和调用getSomeInfo()
之前,可以关闭X服务器(出于低功耗或其他目的),这会导致我的应用程序立即死亡,因为XLib试图退出应用程序如果有错误。
是否有任何机制,例如回调,可以使我理解X Server发生故障,因此我不再使用_display
指针了吗?
答案 0 :(得分:1)
我担心您唯一的选择是使用XSetIOErrorHandler
然后做些难看的事情。
来自https://tronche.com/gui/x/xlib/event-handling/protocol-errors/XSetIOErrorHandler.html:
XSetIOErrorHandler()设置致命的I / O错误处理程序。如果发生任何类型的系统调用错误(例如,与服务器的连接丢失),则Xlib会调用程序提供的错误处理程序。假定这是致命的情况,并且被调用的例程不应返回。如果I / O错误处理程序确实返回,则客户端进程退出。
我建议“做些丑陋的事情”是使用setjmp
和longjmp
:无论何时调用任何Xlib函数,都需要setjmp
。然后,您的I / O错误处理功能longjmp
可以在不退出进程的情况下摆脱I / O错误。