эффект SELECT на чтение () в Linux - PullRequest
0 голосов
/ 09 февраля 2012

У меня есть устаревший код, который делает это:

select(nFD + 1, &tReadFds, NULL, NULL, &timer);
.............
if (FD_ISSET(nFD, &tReadFds)) 
        n = read(nFD,len,x);

это чтение, которое будет считывать весь приемный буфер (nFD), при условии, что 'len' и 'x' достаточно велики.

Я думаю, что SELECT здесь действует как просто способ блокировки, пока данные не станут доступными в буфере recv.

Ответы [ 2 ]

0 голосов
/ 09 февраля 2012

Фрагмент кода вызывает select() с не- NULL параметром тайм-аута. Код ожидает максимально возможного времени, пока сокет не станет доступным для чтения. Если время ожидания истекло, сокет не будет читаемым, и FD_ISSET() вернет false, пропуская вызов read(). Однако, если сокет станет читаемым до истечения времени ожидания, FD_ISSET() вернет true, и гарантируется, что вызов read() не заблокирует вызывающий поток. Он немедленно вернется, либо вернет все данные, которые в данный момент находятся в приемном буфере сокета (максимум len байт), либо вернет 0, если удаленная сторона изящно отключилась.

0 голосов
/ 09 февраля 2012

В двух словах, select - это функция, которую можно вызывать без блокировки (т. Е. Она немедленно возвращается), и по возвращении она сообщит вам список файловых дескрипторов, для которых можно вызвать read (или write) без блокировки.

Такая функция крайне важна, если вы хотите предоставлять постоянную услугу при обработке ввода-вывода только с одним потоком: вы не можете позволить себе ничего , пока выожидание ввода-вывода, и поэтому вам нужен детерминированный метод, чтобы гарантировать возможность неблокирующего ввода-вывода.

Редактировать. Вот пример типичного однопоточного select -сервер, в псевдокоде:

while (true)
{
     select(...);
     read_available_data();
     process_data_and_do_work();  // expensive
}

Такой сервер никогда не должен быть бездействующим, и дорогостоящая функция обработки может занимать почти все доступное вычислительное время (просто нужно убедиться, чтовернуть, когда ему нужно больше данных).Я думаю, что select даже допускает переключение контекста, так что это будет хорошо работать в многопроцессорной среде.

...