Estou fazendo alguma programação de soquete usando a interface POSIX. Estou tentando usar a função select() para monitorar quando um soquete sem bloqueio está pronto para ser lido/gravado.
Ao usar a função select(), dou a ela um conjunto de descritores de arquivo de leitura e gravação. Especificamente, tenho um único soquete fd que desejo verificar se é legível e gravável.
A documentação POSIX afirma que o valor de retorno é uma soma de todos os descritores de arquivo apresentados em todos os conjuntos fd.
Meus primeiros testes mostram que recebo um '2' de volta, o que é bom (isso significa que meu soquete é legível e gravável). No entanto, o que acontece se o descritor de arquivo não se tornar simultaneamente legível/gravável? Digamos que se torne legível um microssegundo antes de se tornar gravável? O que acontece? Ele apenas retorna um 1?
select()
retornará quando pelo menos um dos descritores de arquivo estiver pronto para leitura ou gravação, ou quando o tempo limite for atingido, ou quando interrompido por um sinal.Isso significa que você terá que testar os conjuntos de descritores de arquivo fornecidos
select()
após determinar que pelo menos um descritor de arquivo está pronto para leitura ou gravação (os conjuntos são modificados porselect()
).(da documentação do POSIX em
select()
)Se você precisar do seu descritor de arquivo aberto para leitura e gravação, você terá que fazer um loop
select()
até que ambas as condições sejam atendidas.