Вы не можете просто делать в обработчике сигналов все, что хотите. Обработчик сигнала может прервать выполнение программы в любое время . В том числе, когда он выполняет что-то внутри функции библиотеки C ++ или класса, и ни одна из функций библиотеки C ++, шаблонов и т. Д. Не является реентерабельной, как это. Вы, в значительной степени, не можете использовать какой-либо код библиотеки C ++, и уж тем более std::cout
, в обработчике сигналов. Вы даже не можете сделать new
или delete
ничего. Это первая проблема.
Вы также не можете использовать C библиотечные функции. Они тоже не реентерабельны. Единственное, что вы можете сделать в обработчике сигналов, - это использовать вызовы операционной системы, такие как open / close / read / write и т. Д. (в основном, раздел 2 страниц руководства), напрямую.
Из-за этого показанный код является неопределенным поведением, и вы не можете ожидать, что он будет работать надежно, в любом виде, форме, материи или форме, поскольку пока ваш обработчик сигналов делает то, что делает.
Более того, когда процесс находится в середине самого системного вызова (в зависимости от указанного c системного вызова), перехваченный сигнал приводит к сбою с спецификацией c errno
из EINTR
. Это описано на вашей signal(7)
странице руководства, которую вы должны прочитать. Библиотека C ++, скорее всего, интерпретирует это как любую другую ошибку при чтении из файла и переведет поток в состояние сбоя, что похоже на поведение, которое вы наблюдаете. Вы тоже должны справиться с этим самостоятельно.