LINUX.ORG.RU

IPC, сигналы

 ,


0

2

Штудирую ncurses доки, там заюзаны сигналы, идти распыляться и штудировать все подряд не хочется, а вопросы появились. В целом сигналы понимаю, а вот мелочи - не очень. Такой код:

static void finish(int sig);

int
main(int argc, char *argv[])
{
...
    (void) signal(SIGINT, finish);      /* arrange interrupts to terminate */
...
    finish(0);               /* we are done */
}

static void finish(int sig)
{
    endwin();
    exit(0);
}
  1. Вызов endwin() в хендлере. Равзе это не говнокод? Как бы хз в каком состоянии находилась ncurses после последнего кванта проц времени, а тут дергается ее deinit.

  2. Второй вопрос важнее - если закомментить exit() в хендлере, то что происходит с процессом после возврата из обработчика? Опыт показывает, что процесс после этого нормально не работает, но и не завршается совсем. Какая там магия? Что, если я хочу выполнить некое действие в хендлере и продолжить выполнение основного кода (установить некий exit_flag), как я должен это сделать (там какую-то функцию надо дернуть, да? Какую?).

Зы: начинаешь гуглить про сигналы, там тебе рассказывают про $ kill.

★★

Что, если я хочу выполнить некое действие в хендлере и продолжить выполнение основного кода (установить некий exit_flag), как я должен это сделать (там какую-то функцию надо дернуть, да? Какую?).

Да, в обработчике только установить exit_flag в 1 или TRUE. А в main loop проверять флаг, и выходить, если установлен.

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

Так а какую функцию вызвать надо? Т.е. возрват из хендлера делает процесс инвалидом (после вызова, который произошел после получения сигнала), тут нужно что-то еще сделать, что?

pavlick ★★
() автор топика
Последнее исправление: pavlick (всего исправлений: 1)
Ответ на: комментарий от pavlick

Т.е. возрват из хендлера делает процесс инвалидом

Всё продолжает работать нормально, если в обработчике не были произведены запрещённые вызовы.

Если на момент получения сигнала был активен блокирующий вызов, он возвращается с errno EINTR. При проверке нужно при необходимости проверить exit_flag. Если он не установлен, то повторить вызов такой функции.

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

Всё продолжает работать нормально

Это похоже я ступил. Как-то пытался вывести поток из ожидания ввода от stdin посылкой сигналов, ничего не вышло, приложение падало (завершалось в дефолтном обработчике). Почему-то тот опыт я сюда экстраполировал, хотя он немного о другом), теперь вспомнил. Спасибо.

pavlick ★★
() автор топика
Последнее исправление: pavlick (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.