Я действительно не уверен в требованиях POSIX к безопасности fork
при наличии потоков и сигналов. fork
указывается в качестве одной из функций безопасности, совместимых с асинхронным сигналом, но если есть вероятность, что в библиотечном коде зарегистрировались обработчики pthread_atfork
, которые не являются безопасными по отношению к асинхронному сигналу, делает ли это отмену безопасности fork
? Ответ зависит от того, может ли поток, в котором работает обработчик сигнала, находиться в середине использования ресурса, который требуется обработчикам atfork? Или сказать по-другому, если обработчики atfork используют ресурсы синхронизации (мьютексы и т.д.), Но fork
вызывается из обработчика сигнала, который выполняется в потоке, который никогда не обращается к этим ресурсам, соответствует ли программа?
Основываясь на этом вопросе, если "потокобезопасное" forking реализовано внутренне в системной библиотеке с использованием идиом, предложенных pthread_atfork
(получить все блокировки в обработчике предпродажа и освободить все блокировки как в обработчиках postfork родительского, так и дочернего), то fork
когда-либо безопасно использовать из обработчиков сигналов в многопоточной программе? Разве не возможно, что поток, обрабатывающий сигнал, может находиться посреди вызова malloc
или fopen
/fclose
и удерживания глобальной блокировки, что приводит к тупиковой ситуации во время fork
?
Наконец, даже если fork
безопасен в обработчиках сигналов, безопасно ли оно fork
в обработчике сигнала, а затем возвращается из обработчика сигнала или вызов в fork
в обработчике сигналов всегда требует последующий вызов _exit
или одного из семейств функций exec
до возврата обработчика сигнала?