Во-первых, signal () устарел, лучше использовать sigaction () . Я не думаю, что fork () может полностью исчезнуть, так как его используют многие вещи, но sigaction () обеспечивает гораздо более приятный интерфейс.
Поведение, которое вы испытываете, обычно вызывается вызовом fork () из потока. POSIX обращается к этому конкретно :
Процесс должен быть создан с
одна нить Если многопоточный
процесс вызывает fork (), новый процесс
должен содержать копию вызова
поток и все его адресное пространство,
возможно, включая состояния
мьютексы и другие ресурсы.
Следовательно, чтобы избежать ошибок,
дочерний процесс может выполняться только
безопасные асинхронные сигналы операции до
такое время как одна из функций exec
называется. [THR] Обработчики вил могут
быть установлены с помощью
Функция pthread_atfork () для того, чтобы
поддерживать инварианты приложений через
вызов fork ().
Когда приложение вызывает fork () из
обработчик сигнала и любой из форка
обработчики, зарегистрированные
pthread_atfork () вызывает функцию, которая
не асинхронный сигнал-безопасный,
поведение не определено.
Это означает, что вместо того, чтобы наследовать копию всего адресного пространства родителя, вы наследуете только копию вызывающего threads адресного пространства, которое не содержит ваших обработчиков. Возможно, вы действительно (возможно, даже невольно) вызываете fork () из потока.
Дочерний процесс получает точную копию адресного пространства родителя. Единственная разница с сигналами будет в ожидании сигналов, которые ребенок не получит, так как он получает набор сигналов, инициализированный в ноль. Но да, он получает копию обработчиков.