Во-первых, вам не нужен обработчик сигналов, потому что есть много сигналов, действие которых по умолчанию заключается в прекращении процесса приема. SIGINT
, который вы уже используете, на самом деле является одним из них, но SIGTERM
будет более подходящим выбором для этой цели. Я бы упростил избавление от обработчика и его регистрации, и я бы попросил родителя отправить SIGTERM
вместо SIGINT
.
Если вы все же сохраните обработчик сигнала, тогда вам следует использовать sigaction()
, а не signal()
, чтобы зарегистрировать его, и вы должны пропустить перерегистрацию из реализации обработчика, так как правильное использование sigaction()
делает это ненужным. Кроме того, обработчикам сигналов разрешается вызывать только asyn c -signal-safe функции , и exit()
не является одним из них. Вы могли бы использовать _exit()
или _Exit()
вместо этого, но, опять же, было бы проще просто отбросить обработчик.
Все это несмотря на это, однако, я склонен подозревать, что причина в исходном коде сбой был неверной подписью обработчика сигнала, которую вы исправили в своем редактировании. Для обработчика все еще неправильно вызывать exit()
, но на практике вполне вероятно, что проявление результирующего неопределенного поведения включает завершение программы.