Да, по умолчанию 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
, и все готово