Сервер большую часть времени проводит в msgrcv. Нужно, чтобы он корректно завершался по SIGTERM, поэтому в обработчике сигнала я устанавливаю глобальный флаг, который потом проверяю:
void sig(int)
{
quit = 1;
}
int main()
{
for(;;) {
if(quit)
throw SigException();
// здесь может прийти сигнал
msgrcv(...);
if(quit)
throw SigException();
some_work();
msgsnd(...);
}
}