Todos os números de erro de chamada do sistema são exclusivos?

2

Estou escrevendo um programa para Programação de Sistemas no Unix, e um dos requisitos é processar todos os possíveis retornos de erros das chamadas do sistema.

Portanto, em vez de ter uma função personalizada para cada chamada de sistema, gostaria de ter uma função responsável por essa responsabilidade. Então, todos os retornos de números de erro são exclusivos? Se não, que áreas de sobreposição existem?

    
por Jason 20.03.2011 / 23:23

3 respostas

3

Existem dois aspectos: o modo como o sistema chama o sinal de que ocorreu um erro e a forma como o erro ocorreu é relatado.

A maioria das chamadas do sistema indica que ocorreu um erro ao retornar -1, mas isso não é totalmente universal (por exemplo, algumas chamadas do sistema são sempre bem-sucedidas, por exemplo, getpid ).

Se você souber que ocorreu um erro, o código de erro estará sempre em errno ¹. Existem valores padrão definidos em errno.h , e todas as variantes unix adicionam algumas próprio. Códigos de erro são conhecidos por constantes cujo nome começa com E ; os valores numéricos variam de sistema operacional para sistema operacional. Esses códigos de erro são padrão (por exemplo, EACCESS sempre significa “permissão negada”, EIO sempre significa “erro de entrada / saída”,…), mas o que cada mensagem de erro significa depende da chamada do sistema.

As funções padrão strerror e perror fornece mensagens de erro que você pode exibir para um usuário.

Observe que, se nenhum erro ocorreu durante a última chamada de sistema ou chamada de função da biblioteca C, errno pode conter lixo.

    
por 21.03.2011 / 00:02
2

As únicas sobreposições das quais estou ciente são sinônimos em áreas que historicamente diferiram entre os Unixes derivados de AT & T e BSD. Por exemplo, EAGAIN do AT & T Unix significa a mesma coisa que EWOULDBLOCK do BSD, então eles têm o mesmo valor em sistemas que definem ambos.

    
por 21.03.2011 / 00:03
0

Não, não deve haver sobreposições em errno.h em um determinado sistema. Verifique seu errno.h (provavelmente em algum lugar em / usr / include) para definir a partir de E, como em ENOENT e tal, e faça uma instrução switch() manipulando cada caso. Então você pode chamar sua própria função para todos os erros de chamada do sistema.

(parece que você está implementando perror(3) .

    
por 21.03.2011 / 11:29