O que, como exemplos, pode produzir um POLLNVAL?

2

A referência sobre poll() apenas diz “ O valor fd especificado é inválido. Este sinalizador é válido apenas no membro revents; deve ser ignorado no membro de eventos. ”.

Isso não está claro (pelo menos para mim): se o descritor de arquivo é inválido, não deveria pesquisar retornar um erro (valor de retorno negativo)?

Eu tive a mesma pergunta sobre POLLERR e aprendi em algum lugar que isso pode se referir, por exemplo, a um erro em um dispositivo ou rede. Este, POLLNVAL , permanece misterioso.

Alguém conhece casos de exemplo?

    
por Hibou57 28.02.2015 / 03:58

1 resposta

2

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 .

    
por 01.03.2015 / 00:32

Tags