XLib Disconnection Callback - PullRequest
       34

XLib Disconnection Callback

0 голосов
/ 20 ноября 2018

Я использую 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 Ответ

0 голосов
/ 29 ноября 2018

Боюсь, что ваша единственная возможность - использовать XSetIOErrorHandler, а затем сделать что-то безобразное.

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

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

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

...