Как прервать блокировку вызова accept () - PullRequest
1 голос
/ 07 ноября 2011

Я написал многопоточное приложение на C. У меня создано два потока: один для перехвата всех сигналов, а другой для accept() -иновых клиентских соединений. Когда я уничтожаю приложение, используя killproc, поток с вызовом accept не прерывается. Как я могу это исправить?

Код выглядит так:

int stop_exec=0;

sigCatcherThread()
{
    int sig
    sigset_t allsignals;
    sigfillset(allsignals);

    do{
          sigwait(&allsignals, &sig);
          if(sig==SIGTERM)
            stop_exec=1;
    }while(!stop_exec)

}

clientHandler()
{
  ...
  while(!stop_exec)
  {
      accept(...);
  }

main()
{
   pthread_create(..., sigCatcherThread,..);
   pthread_create(..., clientHandler,...);
}

Ответы [ 3 ]

1 голос
/ 07 ноября 2011

Здесь вы видите использование прерванных системных вызовов. Но удобство потока обработки сигналов, вероятно, выше, чем использование прерванных системных вызовов.

Таким образом, вам нужно, чтобы ваш клиентский обработчик блокировался до тех пор, пока он не сможет принять входящее соединение или не возникнет сигнал. Ожидание потенциального ввода означает либо управляемый сигналом ввод-вывод - путь, по которому я бы не пошел, - либо выбор (2) (или пул). Но select (2) может ждать только на IO. Поэтому преобразуйте свое вхождение сигнала в IO: откройте канал, сделайте так, чтобы ваш поток обработки сигналов записал в канал, когда происходит SIGQUIT, и пусть ваш клиентский поток выберет (2) для сокета и другого конца канала.

0 голосов
/ 08 ноября 2011

Нет необходимости прерывать блокирующий вызов accept. Просто убедитесь, что если поток вернется из accept, скажем, получая фактическое соединение, он не сделает ничего вредного.

Если есть какая-то конкретная причина, по которой вам нужен accept вызов для прерывания, объясните, что это такое. Скорее всего, есть простой способ убрать требование.

0 голосов
/ 07 ноября 2011

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

Как уже упоминалось здесь, вам, вероятно, следует использовать цикл обработки событий, основанный на select().Я бы предложил использовать libevent .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...