URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 5940
[ Назад ]

Исходное сообщение
"Почему иксовая программа при падении икссервера падает тоже? Почему бы"

Отправлено FastSoft , 22-Ноя-06 18:37 
Ну вот если ты - иксовая программа, то почему при падении иксов тебе обязательно нужно грохнуться вслед вместе с изменениями в "открытых" файлах? Нельзя что-ли циклически раз в 0.5 секунды молча и терпеливо пытаться законнектиться назад и при появлении иксов восстать в прежней красе?

Содержание

Сообщения в этом обсуждении
"Почему иксовая программа при падении икссервера падает тоже?..."
Отправлено perece , 22-Ноя-06 19:22 
>Ну вот если ты - иксовая программа, то почему при падении иксов
>тебе обязательно нужно грохнуться вслед вместе с изменениями в "открытых" файлах?
>Нельзя что-ли циклически раз в 0.5 секунды молча и терпеливо пытаться
>законнектиться назад и при появлении иксов восстать в прежней красе?
а это кто как напишет. При падении сервера или связи с ним, по факту ошибки нижележащего (т.е. внутри xlib) send'a или recv'a DeviceID (хэндл, возвращенный ф-ией XOpenDisplay) становится невалидным, и любая (почти) xlib'овская ф-ия вернет ошибку, что дескать неверный id подсунули (почти все иксовые ф-ии принимают его первым параметром).
а поскольку обработку ошибок общепринято делать в виде:
rc=functiontocall(...);
if(rc != success){
  perror(success);
  exit(1);
}
или вариации на тему, то и получаем мессадж типа "connection to display :0 is broken - explicit kill or server shutdown" (печатается perror'ом)
у тех, кто и такой проверки не делает, вообще в корку валится

сделать проверку на ошибки более интелектуальной - можно. но это сильно усложнит логику программы (попробуйте представить себе что для _каждой_ ф-ии, которую вы вызываете нужно предусмотреть правильный recovery path. у вас либо получится полный кошмар из операторов goto, или какой-нть слабопонятный фреймворк, в котором последовательность вызовов считывается в цикле из какого-нть массива и выполняется по одному вызову за проход цикла)
кроме того, если вы пишите не на raw X, а, скажем, на GTK+, то необходимо чтобы вся обработка ошибок прозрачно "пробрасывалась" через тулкит. насколько знаю, в большинстве тулкитов это не сделано.

пишите на raw X, и делайте обработку. никто кроме вашей программы не знает, что есть "правильное поведение" при обрыве. соберите инициализацию (XCreateSimpleWindow,XSelectInput и проч. лабуду вызываемую при старте проги в ф-ию инициализации и делайте обработку ошибок вида:

for(;;){
  rc=functiontocall(devid, ...);
  if(rc == success) break;
  devid=initialize();
}

и буит вам щастье
(про переотрисовку только не забудьте)

\^P^/