В двух словах, select
- это функция, которую можно вызывать без блокировки (т. Е. Она немедленно возвращается), и по возвращении она сообщит вам список файловых дескрипторов, для которых можно вызвать read
(или write
) без блокировки.
Такая функция крайне важна, если вы хотите предоставлять постоянную услугу при обработке ввода-вывода только с одним потоком: вы не можете позволить себе ничего , пока выожидание ввода-вывода, и поэтому вам нужен детерминированный метод, чтобы гарантировать возможность неблокирующего ввода-вывода.
Редактировать. Вот пример типичного однопоточного select
-сервер, в псевдокоде:
while (true)
{
select(...);
read_available_data();
process_data_and_do_work(); // expensive
}
Такой сервер никогда не должен быть бездействующим, и дорогостоящая функция обработки может занимать почти все доступное вычислительное время (просто нужно убедиться, чтовернуть, когда ему нужно больше данных).Я думаю, что select
даже допускает переключение контекста, так что это будет хорошо работать в многопроцессорной среде.