Ваш код имеет основное состояние гонки. Вы не гарантируете, что ребенок завершил вызов signal
до того, как родитель отправит сигналы. Либо нужно использовать какой-то примитив синхронизации, чтобы родительский элемент ожидал, пока дочерний объект установит обработчики, либо вам нужно установить обработчики сигналов перед разветвлением, чтобы дочерний объект унаследовал их.
Вот самый простой способ, которым я знаю для синхронизации процессов, подобных этому:
- Перед разветвлением вызовите
pipe(p)
, чтобы создать канал.
fork()
.
- В родительском
close(p[1]);
(конец письма) и read(p[0], &dummy, 1);
- У ребенка
close(p[0]);
и close(p[1]);
после установки обработчиков сигналов.
- Когда родитель возвращается из
read
, вы можете быть уверены, что ребенок настроил свои обработчики сигналов. На этом этапе вы также можете close(p[0]);
у родителя.
Редактировать 2: Возможно, лучший и более простой подход:
- Перед разветвлением позвоните
sigprocmask
, чтобы заблокировать все сигналы и сохранить старую маску сигналов.
- В родительском файле снова вызовите
sigprocmask
сразу после разветвления, чтобы восстановить исходную маску сигнала.
- У ребенка, позвоните
sigprocmask
сразу после установки обработчиков сигналов, чтобы восстановить исходную маску сигналов.