【问题标题】:XLib Disconnection CallbackXLib 断开连接回调
【发布时间】:2018-11-20 16:02:07
【问题描述】:

我使用 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 服务器已关闭,我不应该再使用 _display 指针?

【问题讨论】:

  • “使用 XCB 而不是 Xlib”算作答案吗?如果是这样,我可以提供这个作为答案。 XCB 从不为您调用exit,它实际上提供了一些错误状态代码。
  • @UliSchlachter 抱歉延迟了将近 2 年 :) 我认为这算是一个答案,因为除了使用 Xcb 之外,我找不到任何其他理智的方法。请回答,我会接受。

标签: xlib xrandr


【解决方案1】:

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

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

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

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

【讨论】:

  • 我不得不说我印象深刻:) 但是我们的代码库不允许这种技巧。
  • 禁止此类黑客攻击对您有好处。对你不利,我猜你唯一的选择是 Xlib。 (你不能插入 libc 的 exit() 来用你自己的无操作函数替换它,对吧?;-))
猜你喜欢
  • 2017-05-10
  • 1970-01-01
  • 1970-01-01
  • 2014-08-28
  • 2020-10-26
  • 1970-01-01
  • 1970-01-01
  • 2021-03-05
  • 1970-01-01
相关资源
最近更新 更多