LINUX.ORG.RU

Обработка сигналов: не атомарный обработчик сигнала с функциями ввода/вывода.


0

0

Здравствуйте. Такой вопрос:
чем вообще грозит не атомарный обработчик сигнала? Чем грозит применение функций ввода/вывода в нём?
Можно ли каким-либо образом написать обрабочик сигнала с функциями ввода/вывода с гарантией, что это не приведёт ни к чему плохому?

★★★★★

В принципе можно. Если в самой программе ты не трогаешь вообще никакие дескрипторы. Сигнал может прервать системный вызов, и кому то не достанется того дескриптора, который использует обработчик. Да и вообще, разветвлённый обработчик вносит сумятицу в программы с селектом в цикле.

vany
()

А если рассмотреть конкретный пример. Могут ли считаться нормальными 
следующие обработчики SIGUSR1, SIGINT и SIGSEGV?

void sigusr1_handler (int signal_number)
{
        fflush(stdout);
}

void sigint_handler (int signal_number)
{
        printf ("\nuser cancel\n");
        fflush(stdout);

        abort();
}

void sigsegv_handler (int signal_number)
{
        fflush(stdout);
        fprintf (stderr, "Segmentation fault\n");

        abort();
}

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

printf без подстановок - зло, есть puts. И cstdio в сигналах - тоже, даже хуже. Да и зачем?

char[] MSG = "Segmentation fault\n";

write(2, MSG, sizeof(MSG) - 1);

в принципе можно. Все остальное - только если cstdio не юзается в основной программе, но тогда незачем делать fflush(stdout).

Ставь флажок и проверяй в цикле. И зачем по sigint корки-то бросать?

anonymous
()

В 99% случаев будет все ок. Но если доведется наступить на грабли, то будет очетнь больно. Гарантируется что с sig_atomic_t все будет хорошо. А вообще есть хороший Signals FAQ в конфе fido7.ru.unix.prog

anonymous
()

Спасибо большое, всем за ответы, советы, ссылки. Будем внимательно изучать/думать...

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