O trecho de código a seguir chama a select()
função.
n = select(max_fd, NULL, &write_set, NULL, NULL)
Ele verifica a disponibilidade de gravação em alguns soquetes. Como geralmente está disponível, o tempo limite não é definido. Em certas iterações do loop, é possível que write_set
esteja vazio.
Abaixo está o rastreamento. Não há mais saída, então presumo que o programa trave.
select(7, NULL, [], NULL, NULL
Minha pergunta é: esse é o comportamento correto? Se o conjunto estiver vazio, o select deve retornar imediatamente? Não há motivo para select()
esperar, certo?
Sim, este é o comportamento correto. POSIX diz
Se nenhum FD for especificado, "verdadeiro para pelo menos um dos descritores de arquivo especificados" nunca será verdadeiro, então ele bloqueia até o tempo limite.
Um conjunto FD vazio é efetivamente o mesmo que passar um ponteiro nulo para esse conjunto.
Este é, na verdade, o comportamento especificado no POSIX (IEEE Std 1003.1-2024) :
Sem descritores de arquivo em nenhum dos conjuntos e sem tempo limite, ele deve ser bloqueado até ser interrompido.