У меня есть программа, которую я хочу принимать и обрабатывать входящие TCP-соединения, пока она не получит сигнал завершения. Есть дополнительные потоки, выполняющие обработку данных, над которыми у меня нет полного контроля, но которые я могу полностью остановить / прервать, если я хочу, чтобы программа завершилась.

while (true)
{
    select(...)?
    if (got-terminate-signal)
    {
        break;
    }
    else
    {
        ...do stuff with sockets based on select...
    }
}
0
Fire Lancer 4 Фев 2015 в 20:19

2 ответа

Лучший ответ

Ваш вопрос не очень ясен, но я попытаюсь понять, к чему вы думаете .

Сигналы подобны прерываниям, а программа, которая их перехватывает, подобна процедурам обслуживания прерываний (аналогия может быть идеальной, а может и не быть). Вы, вероятно, заметили бы тот факт, что сигнал произошел в обработчике, а затем передал сигнал другому потоку через какой-либо метод синхронизации (например, семафор).

Быстрый поиск в Google открывает множество страниц по этой теме. Вот один.

1
Steve 4 Фев 2015 в 17:28

... и возникает вопрос: как я могу поймать SIGTERM в основной программе, но сделать потоки "глухими" к этому сигналу? Думаю .

Функцию pthread_sigmask можно использовать, чтобы разрешить / запретить доставку определенных сигналов в поток. Не все сигналы можно заблокировать таким образом, но SIGTERM может. Для создания необходимого объекта sigset_t вы можете использовать функции sigemptyset и sigaddset . Вы можете просмотреть справочную страницу или щелкнуть здесь: http : //cursuri.cs.pub.ro/~apc/2003/resources/pthreads/uguide/users-96.htm

Обратите внимание, что эта функция работает с «текущим потоком», поэтому ее следует вызывать как первое, что выполняет функция обратного вызова потока (а не «перед запуском потока»).

1
Ethouris 4 Фев 2015 в 18:01