Процесс 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 входить не надо. Хотя входить тоже
пробовал, но не получается.
Re: GTK+ произвести манипуляции из обработчика signal (signal.h)
Заведи пайп, в обработчике сигнала пиши в один его конец с помощью signal-safe функции write, с другого конца слушай select'ом и по прибытии данных дергай любые функции
Re: GTK+ произвести манипуляции из обработчика signal (signal.h)
BreadFan, спасибо за ответ.
Но для моей достаточно простой программы (~200 Kb), это будет слишком
сложно. Пожалуй, сделаю глобальный флаг, который будет выставляться
обработчиком signal, и добавлю таймер, который каждые 5 секунд будет
этот флаг анализировать. Да, я не написал в топике, что небольшая
задержка некритична.
Re: GTK+ произвести манипуляции из обработчика signal (signal.h)
это несложно совсем + у Стивенса в первом томе сетевого программирования этот пример рассмотрен. Он как вариант еще предлагает использовать longjmp. Я в своем коде с пайпами сделал, вот его размер: :)
$ ls -lh ~/src/ssldec.c
-rw-rw-r-- 1 yura yura 18K Oct 11 09:02 ~/mycode.c
Re: GTK+ произвести манипуляции из обработчика signal (signal.h)
Advanced Linux programming (Программирование в Linux. Профессиональный подход) - неплохая обзорная книжка, небольшая - лучше прочитать в электронном виде
Стивенс - Unix: Разработка сетевых приложений. UNIX: взаимодействие процессов.