0

我使用 XLib 和 XRand 来获取有关嵌入式系统上已连接显示器的一些信息。

class Foo {
private:
    Display *_display{};

public:
    Foo() {
        _display = XOpenDisplay(":0.0");
    }

    void getSomeInfo() const {
        /* Get some info with _display */
    }

    ~Foo() {
        XCloseDisplay(_display);
    }
}

问题是,X 服务器可以在创建 Foo 实例之后和调用之前关闭(出于低功耗或其他目的)getSomeInfo(),这会导致我的应用程序立即死亡,因为 XLib 会在出现错误时尝试退出应用程序。

是否有任何机制,比如回调,可以让我理解 X 服务器出现故障并且我不应该再使用_display指针了?

4

1 回答 1

1

我担心你唯一的选择是使用XSetIOErrorHandler然后做一些丑陋的事情。

来自https://tronche.com/gui/x/xlib/event-handling/protocol-errors/XSetIOErrorHandler.html

XSetIOErrorHandler() 设置致命的 I/O 错误处理程序。如果发生任何类型的系统调用错误(例如,与服务器的连接丢失),Xlib 会调用程序提供的错误处理程序。这被认为是致命的情况,并且被调用的例程不应该返回。如果 I/O 错误处理程序确实返回,则客户端进程退出。

我建议的“做一些丑陋的事情”是使用setjmpand longjmp:每当你调用任何 Xlib 函数时,你setjmp之前。然后,您的 I/O 错误处理函数longjmp会在不退出进程的情况下摆脱 I/O 错误。

于 2018-11-29T16:24:06.537 回答