nixp.ru v3.0

18 октября 2017,
среда,
03:18:27 MSK

DevOps с компанией «Флант»
Аватар пользователя rgo
rgo написал 10 июля 2006 года в 01:25 (743 просмотра) Ведет себя неопределенно; открыл 61 тему в форуме, оставил 1602 комментария на сайте.

согласно всяким туторам/докам/книгам, с которыми я сталкивался, select надо использовать примерно так:

while (...) {
    FD_ZERO (&fds)
    /* всякие там FD_SET */
    /* ... */
    ret = select (..., &fds, ...);
}

всё замечательно, но вот вопрос который мне покоя не даёт: почему FD_ZERO вечно внутри цикла? зыркал в apache, там тоже FD_ZERO в цикле. Почему никто не пользует FD_CLR?

sas

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 );
}
rgo
sas
Для упрощения проверок и кода и используют: FD_ZERO; FD_SET… FD_SET. в цикле.

угу, наверное, всё-таки так.

да и наверное, тк дескрипторов не очень много, memcpy + FD_CLR + FD_SET, не сильно выгоднее чем FD_ZERO + FD_SET.