#c #select #asynchronous
#c #выберите #асинхронный
Вопрос:
Есть ли способ заставить ‘select’ ожидать чтения и записи, а также иметь возможность добавлять новые файловые дескрипторы? Предпочтительно в одном потоке?
Комментарии:
1. Если у вас есть только один поток, то кто добавляет новые файловые дескрипторы?
2. @Oli: Я думаю, OP просто хочет отменить
select
вызов и добавить дескриптор до того, как будет выполнен другой вызовselect
.3. @Andre: Но только с одним потоком, когда он хочет прервать
select
? Есть ли какой-то внешний стимул?4. @Oli: Ну, я на самом деле использую сокеты. Так может подключаться больше клиентов.
5. @Andrew: Но, по-видимому, ваш прослушивающий сокет является частью этого select, поэтому при подключении нового клиента select возвращается , что позволяет вам изменить набор fd для следующего вызова.
Ответ №1:
Теперь, когда я знаю, каков ваш сценарий (сервер на основе сокетов, который может захотеть принимать новые входящие подключения), знаете ли вы, что вы можете добавить файловый дескриптор для вашего прослушивающего сокета в список для select
? Смотрите, например http://www.lowtek.com/sockets/select.html.
(Перефразированный пример:)
fd_set socks;
FD_ZERO(amp;socks);
// Add listener socket
listen(sock, n);
FD_SET(amp;socks, sock);
// Add existing socket connections
for (i = 0; i < num_existing_connections; i )
{
FD_SET(amp;socks, connection[i]);
}
// Will break if any of the existing connections are active,
// or if a new connection appears.
select(..., amp;socks, ...);
Комментарии:
1. Веб-сайт был очень полезен. Спасибо!
Ответ №2:
Насколько я думаю, вы можете сделать это в том же потоке, но не в одно и то же время. В подобной проблеме я обычно добавляю свой фиктивный сокет обратного цикла в список дескрипторов, и всякий раз, когда мне нужно добавить новый сокет в FD_LIST, я просто отправляю байт в свой фиктивный сокет, и это прерывает цикл выбора. Затем я могу обновить FD_LIST и снова возобновить работу с select.
Комментарии:
1. Вы также можете добавить время ожидания к
select
вызову, используя последний параметр.2. Да, конечно. Но в этом случае, если вы используете длительный интервал времени в select, вам придется подождать, пока ваш новый сокет не будет добавлен в FD_LIST. Если вы используете очень короткий интервал в select или вам не нужно сразу добавлять сокет, то использование параметра interval является хорошим вариантом.