c выберите асинхронное программирование

#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 является хорошим вариантом.