LINUX.ORG.RU

Fork from signal handler

 


0

2

Встал вопрос. Если в хендлере сигнала сделать вот такое безобразие:

pid_t pid = fork();
if (pid == 0)
{
  do_some_shit(); /* never return */
}


То что внутри do_some_shit должно быть async safe?

★★★

async safe - в каком смысле? По идее сигнал мог прийти в любой момент работы приложения - поэтому текущие данные могут быть в «недописанно состоянии». Так что работа с ними должна быть соответственной.

Далее - других потоков в дочернем процессе нет и код не выходит - значит по идее больше никто не будет менять данные кроме выполняемого кода. Разве что другой сигнал придёт, не знаю может ли такое быть.

А вот безопасность самого fork - неясно. Особенно если нет уверенности, что не было pthread_atfork с каким-нибудь хитрым обработчиком

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

Так безопасность fork() гарантируется же. Есть списки функций, которые безопасно вызывать в обработчиках сигналов, и fork() там есть.

anonymous
()

Опасно иметь не async safe только тогда, когда ты можешь прервать выполнение этой функции сигналом и начать ее выполнять сначала. Если ты уверен, что выполнение будет один раз и в чайлд не прилетит этот же сигнал (а чайлды получают настройки сигналов перентов), то будет ок.

anonymous
()

Лучше перед форком заблокируйте все сигналы, а после форка в родителе верните как было, в дочернем же процессе сначала установите иные обработчики (или установите их игнорирование), а затем разблокируйте, и тогда делайте что хотите.

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