sem_wait нельзя использовать в обработчике сигналов по этой причине:
Поток A вызывает sem_wait для sem1.Когда поток A закончен, он отправляет сообщение в sem1.Однако, прежде чем он может закончить, сигнал получен, и затем вводится обработчик, вызывающий sem_wait для sem1.Поскольку A - это то, что будет отправлять в sem1, обработчик никогда не вернется, и у вас будет тупик.Вот почему это хорошее правило - никогда не ждать чего-либо в обработчике сигналов.Проблема, ASFAIK, больше связана с взаимоблокировкой, чем сбоем.
Кроме того, это нарушает идеальную цель обработчика сигнала - обработать внешнее прерывание и затем быстро вернуться к тому, что вы делали.
Наконец, не лучше ли избавиться от SIGSEGV вместо того, чтобы обращаться с ним?