POLLNVAL
é definido se o número do descritor de arquivo não corresponder a um descritor de arquivo.
Não sei ao certo por que esse comportamento foi escolhido, em vez de ter poll
retornando um erro. O motivo pode ter sido a facilidade de implementação: ele permite que a implementação faça um loop sobre a matriz de struct pollfd
uma vez, sem ter que lidar com um retorno antecipado em que alguns elementos da matriz teriam sido modificados e outros não.
Também é possível que o motivo seja a conveniência do programador. Como chamar poll
em um descritor de arquivo inválido não é um erro, é possível fechar um descritor de arquivo e ainda incluí-lo na matriz. Essa conveniência é de interesse limitado: você só pode fazer isso contanto que não abra nenhum outro arquivo (porque ele pode reutilizar o descritor de arquivo), e você ainda pagará a penalidade (minúscula) de desempenho pelo elemento da matriz. Pode ser útil em um programa multithread, onde um thread pode chamar close
enquanto outro thread está envolvido em uma chamada poll
ou prestes a fazer isso: isso não é um erro, o thread de pesquisa só precisa ser notificado antes de um open
.