Здесь происходит несколько проблем. В trata_SIGSEGV может быть больше.
- Вы не даете времени после разветвления для процессов, которые нужно настроить, чтобы быть готовыми к обработке. Поскольку вы отправляете сигналы завершения по умолчанию, скорее всего, они убивают получателя до того, как получатель его прослушивает. (Думаете ли вы, что сигнал ждет сигнала? Это не так; он просто определяет, что следует делать, если / когда сигнал случится.)
- Строка 19 пытается отправить сигнал trata_SIGSEGV для обработки SIGUSR2. Это не сработает.
- Вы заканчиваете проблемой, с которой начинаете - основной поток выполнения не имеет задержек в своей обработке, от разветвления процессов до указания планировщику просто завершить их.
На современном компьютере, вероятно, даже задержка в миллисекунду будет намного более чем достаточной для настройки обработчиков сигналов. Но если вы хотите, чтобы они происходили надежно, вам нужно дать как минимум некоторую задержку, чтобы другие процессы смогли добраться туда, где они должны быть.
В качестве альтернативы, я думаю, вы могли бы установить обработчики сигналов в родительском объекте, а затем выполнить форк.
Учитывая ваше обновление, мне интересно, откуда вы знаете, какой процесс получил какой сигнал. Мое предложение для вашего обработчика сигнала:
void trata_SIGSEGV(int sig) {
printf("%d received signal %d\n", getpid(), sig);
if (SIGINT == sig) exit(1);
}
Кроме того, я замечаю, что вы отправляете первый сигнал процессу 2, прежде чем проверять, что представляет собой ответная вилка, поэтому процесс 2 сигнализирует сам, прежде чем он, возможно, сможет настроить обработчики сигналов. Настройте обработчики сигналов перед тем, как разветвляться, чтобы там не было гонки. В моем собственном тесте вашего кода я проверил, что обработчики сигналов сохраняются в форке.