Select EBADF: qual FD é ruim?

votos
12

Temos um bug de longa data no nosso código de produção. Esta é essencialmente uma tomada com base daemon. Ele ouve um monte de filedescriptors usando select.

Ocasionalmente (uma vez por dia ou mais), seleccione voltará com EBADF.

Eu escrevi o código para procurar o mau FileDescriptor, que faz um loop sobre cada fd e chama selecione nele. Estas chamadas nunca mais voltar EBADF. Eu também tentei fstat. Eles também nunca mais voltar EBADF.

Eu também reescreveu o daemon de usar poll. Isso não ajudou.

Alguém tem algumas outras idéias? (Para além de eu cometi um erro estúpido, que é tudo para fácil de fazer com select).

Publicado 19/05/2009 em 15:57
fonte usuário
Em outras línguas...                            


3 respostas

votos
4

Concordo com James. Com poll (), você tem revents por fd que pode ser facilmente verificados.

Ou seja,

struct pollfd fds[NUM_FDS];
int ret, i;

...

ret = poll(fds, NUM_FDS, POLL_TIMEOUT);
for (i = 0; i < NUM_FDS; i++)
  if (fds[i].revents & POLLHUP || fds[i].revents & POLLNVAL)
     ... do something ...

Claro que você não iria implementá-lo dessa forma no mundo real, é apenas um exemplo. Eu parei de usar select () há muito tempo, poll () é uma interface muito melhor. Você está correto, apenas a sua demasiado fácil para atirar no próprio pé com select ().

Respondeu 20/05/2009 em 06:13
fonte usuário

votos
4

Muito provavelmente, a selecté chamado em um descritor de arquivo fechado. A fonte usual de que está reutilizando a fd_setsem re inicializando-lo. Você tem alguma coisa acontecendo nos manipuladores de sinais? (como re-abrir um arquivo de log em um HUP?)

Respondeu 19/05/2009 em 16:09
fonte usuário

votos
3

Se você usar poll (), então você pode passar os dados e procurar o que fd está falhando, que é a grande vantagem.

Respondeu 19/05/2009 em 19:25
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more