Uma chamada do sistema com 'EINTR' não documentado retorna 'EINTR'?

1

Estou escrevendo um pequeno aplicativo e quero torná-lo o mais portátil possível (Linux, * BSD e possivelmente outros UNIXes). Meu principal problema é o gerenciamento de EINTR . Eu li que existem algumas chamadas de sistemas em alguns sistemas que podem retornar EINTR , embora não esteja documentado (por exemplo, stat(2) no Linux ). Está correto?

Minha solução atual é usar um wrapper em torno de cada chamada de sistema para tentar novamente em EINTR , mesmo que esteja documentado para não retornar esse erro. Isso é seguro em todos os sistemas "compatíveis com POSIX"? O que pode estar errado usando essa abordagem? É realmente recomendado / necessário?

    
por user3368561 10.09.2018 / 19:34

1 resposta

0

I read that there are some systems calls on some systems that can return EINTR although it is not documented (for example stat(2) on Linux). Is this correct?

A menos que você tenha bloqueado todos os sinais, todas as chamadas do sistema que podem ser bloqueadas na E / S podem retornar EINTR . Esse é um comportamento genérico do kernel, por isso, é justificável que ele não seja documentado repetidamente para cada tipo de syscall. Você também não esperaria encontrar documentação repetida para EIO em cada I / O syscall pelo mesmo motivo.

Mais amplamente, as man pages do Linux não listam os erros que podem retornar de forma exaustiva. Além de você ter situações como as descritas acima, também há muitas camadas no kernel, então o que cada syscal pode retornar depende de quais drivers e coisas estão envolvidas. O conjunto de possíveis valores de errno quando read(2) retornará -1 será diferente se o fd referir-se a um arquivo em um sistema de arquivos XFS do que se se referir a um FIFO. Não é razoável esperar que a página man forneça a união de todos os possíveis códigos de retorno de erro; ele recapitularia em grande parte errno(3) se isso acontecesse.

What can be wrong using this approach? It is really recommended/needed?

A reinicialização cega de syscalls pode não ser a coisa certa em seu aplicativo. O recurso syscalls retorna EINTR para dar ao seu aplicativo uma chance de lidar com o sinal no contexto de chamada, em oposição ao contexto do manipulador de sinal. Isso pode ajudá-lo a evitar variáveis globais, por exemplo.

Para obter uma perspectiva sobre isso, consulte EINTR e o que é bom para .

Observe também o sigaction apontado nesse artigo: você pode controlar esse comportamento com SA_RESTART . Se a sua próxima pergunta for se você deve definir o sinalizador como 1 ou 0, a resposta é que isso depende do seu aplicativo.

    
por 10.09.2018 / 20:37

Tags