XLib Disconnection Callback

Я использую 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 указатель больше?

1 ответ

Я боюсь, что ваш единственный вариант - это использовать XSetIOErrorHandler а потом делать что-то безобразное.

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

XSetIOErrorHandler() устанавливает обработчик фатальной ошибки ввода-вывода. Xlib вызывает предоставленный программой обработчик ошибок, если возникает какая-либо ошибка системного вызова (например, потеря соединения с сервером). Предполагается, что это смертельное состояние, и вызываемая процедура не должна возвращаться. Если обработчик ошибок ввода / вывода возвращается, клиентский процесс завершается.

"Сделай что-нибудь уродливое", которое я бы предложил, это использовать setjmp а также longjmp: Всякий раз, когда вы вызываете какие-либо функции Xlib, вы setjmp до. Ваша функция обработки ошибок ввода / вывода тогда longjmps, чтобы избежать ошибки ввода-вывода без выхода из процесса.

Другие вопросы по тегам