rgo
написал 10 июля 2006 года в 01:25 (1323 просмотра)
Ведет себя
неопределенно; открыл 61 тему в форуме, оставил 1603 комментария на сайте.
согласно всяким туторам/докам/книгам, с которыми я сталкивался, select надо использовать примерно так:
while (...) {
FD_ZERO (&fds)
/* всякие там FD_SET */
/* ... */
ret = select (..., &fds, ...);
}
всё замечательно, но вот вопрос который мне покоя не даёт: почему FD_ZERO вечно внутри цикла? зыркал в apache, там тоже FD_ZERO в цикле. Почему никто не пользует FD_CLR?
Последние комментарии
-
OlegL, 17 декабря 2023 года в 15:00 →
Перекличка
21
-
REDkiy, 8 июня 2023 года в 9:09 →
Как «замокать» файл для юниттеста в Python?
2
-
fhunter, 29 ноября 2022 года в 2:09 →
Проблема с NO_PUBKEY: как получить GPG-ключ и добавить его в базу apt?
6
-
Иванн, 9 апреля 2022 года в 8:31 →
Ассоциация РАСПО провела первое учредительное собрание
1
-
Kiri11.ADV1, 7 марта 2021 года в 12:01 →
Логи catalina.out в TomCat 9 в формате JSON
1
DevOps as a Service from Palark
24/7 SRE & DevOps service to cover all your Kubernetes needs.

select изменяет fds. Например перед вызовом select мы положили (FD_SET) 10, 12, 18 файловые дескрипторы (fd) в сет. После вызова select fds может содержать например только один fd==12 на котором есть какая либо активность (например пришло чтоьто). Для упрощения проверок и кода и используют: FD_ZERO; FD_SET… FD_SET. в цикле.
По поводу FD_CLR:
Псевдо код: FD_ZERO == { for ( i=0; i < nfds; i++ ) if ( FD_ISSET( fd[ i ], &fds ) ) /* проверили является ли fd[ i ] членом fds*/ FD_CLR( fd[ i ], &fds ); }Другая альтернатива:
fd_set orig, work; FD_ZERO( work ); FD_ZERO( orig ); FD_SET( fd1, orig ); FD_SET( fd2, orig ); FD_COPY( work, orig ); while ( ... ) { select( ... ) ... FD_COPY( orig, work ); }угу, наверное, всё-таки так.
да и наверное, тк дескрипторов не очень много, memcpy + FD_CLR + FD_SET, не сильно выгоднее чем FD_ZERO + FD_SET.