LINUX.ORG.RU

Как правильно реагировать на kill?


0

0

Пишу прогу на C (Xlib), и в начале создаю GC вызовом XCreateGC(), но мне нужно потом вызвать XFreeGC(), причем это сделать перед завершение работы программы. Допустим, при нормальном завершении работы программы, я могу это сделать с помощю XEvent, а если я сделаю kill прога? Ведь при этом XFreeGC не вызовется, а это как я понимаю не есть хорошо. Та же история я malloc/free.

Есть ли способ ловить попытку выключения проги(от любого источника) и корректно завершить работу?

★★★★★

man 2 signal ?
Только -9 перехватить по-любому не получится ... ну мож ещё кой-какие. А другие перехватить можно.

RomanU
()

проставь Destroy в SetCloseDownMode и не парься ..

кстати я так и не понял как ты с помощью XEvent можещь освободить gc

lg ★★
()

Нужно вешать обработчик сигнала на тот сигнал который ты
посылаешь и хочешь обработать. Внутри обработчика или
в функции вызываемой из него нужно выполнить те действия которые 
хочется. Не перехватываемые сигналы: -9(SIGKILL), SIGSTOP.
man signal :
" signals SIGKILL and SIGSTOP cannot be caught or ignored. "

anonymous
()
Ответ на: комментарий от anonymous

a что плохово случится? память потеряется? ГС закончатся у Х11? что будет, или просто некрасиво?

no1sm ★★
()

> Ведь при этом XFreeGC не вызовется, а это как я понимаю не есть хорошо. Та же история я malloc/free.

Если проблема только в этом, то можешь не заморочиваться. Память и иксовые ресурсы автоматом освободятся при смерти программы.

nobody ★★
()
Ответ на: комментарий от nobody

Ну так вот, зачем же тогда освобождать-то?? или может это типа кнопочки такой? можно из обработчика послать сообщение XPending'u, или кому еще там, который спит на select display->fd? в гтк вроде можно я всегда хотел добавить display->fd в свой список select'a, а вот: можно создать пайп и повесить его на селект с дисплеем, а из хандлера записывать туда слово...ну а дальше твоя программа начинает понимать, что пора заканчиваться более или менее экстренно...

no1sm ★★
()
Ответ на: комментарий от no1sm

>Ну так вот, зачем же тогда освобождать-то?? 

Представьте что Ваша программа работает с определенным 
набором данных сформированным в памяти. Эти данные записываются
в файлы на диске не всегда. Вы посылаете SIGKILL - убиваете
прогу, данные в памяти теряются => последствия. Кроме этого
могут некорректно сбрасываться системные буферы используемые
во время обращения к неким API.
Если Вы перехватите SIGTERM и все ручками обработаете,
сериализация данных закрытие открытых дескрипторов,
сброс и освобождение буферов - тогда хорошо.
Тем и отличаются системные проги от пользовательского интерфейса.
Больше внутренней работы (невидной глазу).

anonymous
()
Ответ на: комментарий от lg

> проставь Destroy в SetCloseDownMode и не парься ..

> кстати я так и не понял как ты с помощью XEvent можещь освободить gc

Ловить нажатия клавиш и при нажатии на Esc освобождать gc и выходить, например. Или кнопка "выход" какая-нибудь - реагировать на ее нажатие.

init ★★★★★
() автор топика
Ответ на: комментарий от anonymous

понятно, наверное сделаю обработчик сигнала.

init ★★★★★
() автор топика
Ответ на: комментарий от init

не парься :)

по дефолту если ты не менял моду она Destroy то есть все ресурсы выделеные тобой на X сервере сдохнут .. так же в операционке ты работаешь в виртуальном простанстве мемори которая связана с твоим процессом в случае если твой процесс дохнет, это виртуальное пространсво сдохнет

lg ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.