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
до. Ваша функция обработки ошибок ввода / вывода тогда longjmp
s, чтобы избежать ошибки ввода-вывода без выхода из процесса.