Тема заблокирована ожидающим сообщением - PullRequest
2 голосов
/ 25 апреля 2011

У меня pthread работает и ждет сообщений из сокета.Поток блокируется для ожидания сообщения и не просыпается до получения нового.Есть ли способ отправить сигнал потоку, чтобы он проснулся и функция приема ( recvmsg ) вернула код ошибки, связанный с сигналом?

1 Ответ

3 голосов
/ 25 апреля 2011

Да, по умолчанию SIGINT прерывает все системные вызовы.Начиная с man recv:

    EINTR  The receive was interrupted by delivery of a signal before any 
           data were available; see signal(7). 
and 
    MSG_WAITALL (since Linux 2.2)
          This flag requests that the operation block until the full request is 
          satisfied.  However, the call may still return less data than requested
          if a signal is caught, an error or disconnect occurs, or the next 
          data to be received is of a different type than that returned.

Однако вы не можете указать целевой поток или конкретную операцию.

Если вы хотите иметь это, я предлагаю использовать условие, которое получающий поток может явно прослушивать.Существует известный трюк на linux, который позволяет принимающему потоку использовать select или poll до listen для сокета и 'condition' одновременно [1].

Хитрость заключается в том, чтобы открыть канал от основного потока к клиентскому (принимающему) потоку.Мастер пишет в канал при достижении определенного состояния (так сказать, сигнал).Клиентский (принимающий) поток может просто опрашивать оба канала и сокета и только проверять, кто из них пробудил его.


[1] обычно pthread_cond_waitи poll / select нельзя объединить без гонок, поэтому вам нужно запрограммировать циклы ожидания с небольшими тайм-аутами.На Win32, напротив, это так просто, как WaitForMultipleObjects, и все готово

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