У меня есть программа, которую я хочу принимать и обрабатывать входящие TCP-соединения, пока она не получит сигнал завершения. Есть дополнительные потоки, выполняющие обработку данных, над которыми у меня нет полного контроля, но которые я могу полностью остановить / прервать, если я хочу, чтобы программа завершилась.
while (true)
{
select(...)?
if (got-terminate-signal)
{
break;
}
else
{
...do stuff with sockets based on select...
}
}
2 ответа
Ваш вопрос не очень ясен, но я попытаюсь понять, к чему вы думаете .
Сигналы подобны прерываниям, а программа, которая их перехватывает, подобна процедурам обслуживания прерываний (аналогия может быть идеальной, а может и не быть). Вы, вероятно, заметили бы тот факт, что сигнал произошел в обработчике, а затем передал сигнал другому потоку через какой-либо метод синхронизации (например, семафор).
Быстрый поиск в Google открывает множество страниц по этой теме. Вот один.
... и возникает вопрос: как я могу поймать SIGTERM в основной программе, но сделать потоки "глухими" к этому сигналу? Думаю .
Функцию pthread_sigmask можно использовать, чтобы разрешить / запретить доставку определенных сигналов в поток. Не все сигналы можно заблокировать таким образом, но SIGTERM может. Для создания необходимого объекта sigset_t вы можете использовать функции sigemptyset и sigaddset . Вы можете просмотреть справочную страницу или щелкнуть здесь: http : //cursuri.cs.pub.ro/~apc/2003/resources/pthreads/uguide/users-96.htm
Обратите внимание, что эта функция работает с «текущим потоком», поэтому ее следует вызывать как первое, что выполняет функция обратного вызова потока (а не «перед запуском потока»).
Похожие вопросы
Новые вопросы
c++
C++ — это язык программирования общего назначения. Изначально он разрабатывался как расширение C и имел аналогичный синтаксис, но теперь это совершенно другой язык. Используйте этот тег для вопросов о коде, который будет скомпилирован с помощью компилятора C++. Используйте тег версии для вопросов, связанных с конкретной стандартной версией [C++11], [C++14], [C++17], [C++20] или [C++23]. и т.д.