LINUX.ORG.RU

GTK+ произвести манипуляции из обработчика signal (signal.h)


0

0

Процесс A, у которого есть "дочерний поток" B.
gtk_main запускается из A:

..........
gdk_threads_enter()
gtk_main()
gdk_threads_leave()
..........

Выше в A установлен обработчик сигнала(неважно какого,
пусть это будет SIGUSR1: signal(SIGUSR1, handler)),
обработчик должен создать GtkMessageDialog, при закрытии которого
по Cancel или крестику, должен вызваться обработчик, установленный
средствами glib (g_signal_connect).

Поток B периодически входит в цикл gtk_main  с помощью
gdk_threads_enter()/gdk_threads_leave() и производит злобные манипуляции.

Вопрос: что писать в коде handler для создания диалога?
Если делать просто и по-тупому через создать диалог/run_dialog, то
процесс вываливается с XLib-ошибкой. Я так понимаю, что после
возникновения сигнала SIGUSR1 процесс останавливает работу, и выполняется
обработчик, т.е. в gdk_threads входить не надо. Хотя входить тоже
пробовал, но не получается.


★★★★★

man 7 signal
Раздел Async-signal-safe functions

Остальные функции из обработчика сигнала по стандарту вызывать нельзя. Их работоспособность не гарантируется -> ССЗБ

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

Заведи пайп, в обработчике сигнала пиши в один его конец с помощью signal-safe функции write, с другого конца слушай select'ом и по прибытии данных дергай любые функции

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

BreadFan, спасибо за ответ.

Но для моей достаточно простой программы (~200 Kb), это будет слишком
сложно. Пожалуй, сделаю глобальный флаг, который будет выставляться
обработчиком signal, и добавлю таймер, который каждые 5 секунд будет
этот флаг анализировать. Да, я не написал в топике, что небольшая
задержка некритична.

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

это несложно совсем + у Стивенса в первом томе сетевого программирования этот пример рассмотрен. Он как вариант еще предлагает использовать longjmp. Я в своем коде с пайпами сделал, вот его размер: :)

$ ls -lh ~/src/ssldec.c
-rw-rw-r-- 1 yura yura 18K Oct 11 09:02 ~/mycode.c

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

Пользуясь случаем, прошу тебя посоветовать какую-нибудь хорошую книгу по сокетам/трубам.
Если есть такая любимая книга.

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

Как уже сказали - longjmp неплохое решение. Довольно понятно выглядит в коде и безопасно используется вместе с сигналами.

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

Advanced Linux programming (Программирование в Linux. Профессиональный подход) - неплохая обзорная книжка, небольшая - лучше прочитать в электронном виде
Стивенс - Unix: Разработка сетевых приложений. UNIX: взаимодействие процессов.

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

гы, только щас заметил, что не везде вывод ls подтер :)

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