У меня есть нить в приложении, которая имеет такой цикл:
...
while (1)
{
checkDatabase();
checkChildren();
sleep(3);
}
...
checkDatabase()
говорит само за себя; checkChildren()
просто вызывает waitpid(-1, &status, WNOHANG)
, чтобы иметь дело с дочерними процессами, которые либо вышли, либо получили сигнал.
Приложение работает довольно хорошо, но имеет обработку сигналов по умолчанию. Проблема в том, что у этого родительского процесса есть несколько потоков (пока не беспокойтесь о дочерних процессах), и у меня нет опыта работы с синхронными сигналами, не говоря уже о приложении потоков POSIX. Я использовал signal()
и раньше, но, видимо, он не переносимый и в любом случае он не делает то, что мне нужно. У меня нет никакого опыта работы с sigaction
методами, и я не могу найти хорошую документацию о том, как заполнять структуры и т. Д.
Что мне нужно сделать, так это синхронно перехватить завершающие сигналы, такие как SIGINT
, SIGTERM
и SIGQUIT
в вышеуказанном цикле (и мне нужно вообще игнорировать SIGPIPE
, чтобы я мог отловить ошибку EPIPE
из методов ввода-вывода), так это будет выглядеть так:
...
while (1)
{
checkDatabase();
checkChildren();
checkForSignals();
sleep(3);
}
...
Все остальные темы не должны иметь ничего общего с сигналом; только поток, который выполняет этот цикл, должен знать об этом. И, очевидно, это должна быть проверка неблокирующая , чтобы цикл не блокировался во время первой итерации. Метод, вызываемый в случае обнаружения сигнала, будет сортировать другие потоки и уничтожать мьютексы, и все такое.
Может кто-нибудь дать мне хедз-ап? Большое спасибо.