Quando POSIX select () realmente retorna?

1

Eu estou fazendo algumas programações de socket usando a interface POSIX. Estou tentando usar a função select () para monitorar quando um soquete não-bloqueador está pronto para ser lido / escrito.

Ao usar a função select (), dou a ela um conjunto de descritores de arquivos de leitura e gravação. Especificamente, eu tenho um único soquete fd que eu quero verificar se é legível e gravável.

A documentação do POSIX indica que o valor de retorno é uma soma de todos os descritores de arquivo caracterizado em todos os conjuntos de fd.

Meus testes iniciais 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 torna simultaneamente legível / gravável? Digamos que se torne legível um microssegundo antes de se tornar gravável? O que acontece? Isso apenas retorna um 1?

    
por Izzo 30.04.2018 / 23:45

1 resposta

3

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 for interrompido por um sinal.

Isso significa que você terá que testar os conjuntos de descritores de arquivo fornecidos para select() após determinar que pelo menos um descritor de arquivo está pronto para leitura ou gravação (os conjuntos são modificados por select() ).

Upon successful completion, the pselect() or select() function shall modify the objects pointed to by the readfds, writefds, and errorfds arguments to indicate which file descriptors are ready for reading, ready for writing, or have an error condition pending, respectively, and shall return the total number of ready descriptors in all the output sets. For each file descriptor less than nfds, the corresponding bit shall be set upon successful completion if it was set on input and the associated condition is true for that file descriptor.

(da documentação do POSIX em select() )

Se você precisar que o descritor de arquivo seja aberto para leitura e gravação, será necessário executar um loop por select() até que as duas condições sejam atendidas.

    
por 02.05.2018 / 09:09

Tags