Por que definir errno como zero no momento da inicialização do programa e não pode testá-lo antes que o erro ocorra? [fechadas]

4

Estou lendo o material disponível na variável errno do arquivo de cabeçalho <errno.h> .

Eu li:

"Um valor de 0 indica que não há erro no programa." e "Como uma boa prática, o desenvolvedor deve definir errno para 0 no momento da inicialização do programa"

Por convenção, verificamos a variável errno apenas quando ocorre um erro (como algumas das funções retornadas com -1).

Pergunta 1: Então, qual é a utilidade de definir errno para 0 antes de iniciar o programa.

Mais, eu li que é melhor armazenar o número do erro na variável local e depois verificar, ou seja,

 if (somecall() == -1) {
      printf("somecall() failed\n");
      if (errno == ...) { ... }
      }

No código acima, é possível que printf() chamada de função possa sobrescrever o valor de errno , se algum erro ocorrer com printf() .

Pergunta 2: A declaração acima se aplica a perror() e strerror() , porque elas também são chamadas do sistema e existe a possibilidade de que o erro tenha ocorrido com elas também.

Na programação avançada no ambiente UNIX por Richard Stevens, eu li que devemos examinar o valor de errno , somente quando o valor de retorno de uma função indica que ocorreu um erro. Eu não entendo porque?

    
por munjal007 03.03.2015 / 12:39

2 respostas

5

By convention we check the errno variable only when there is an error occurred (like some of the function returned with -1).

Question 1 : Then what is the use of setting errno to 0 before starting the program.

Na verdade, só devemos verificar errno no caso em que ocorreu um erro. Isso ocorre porque, se nenhum erro ocorreu, ainda é possível que errno contenha um valor diferente de zero (por exemplo, se um erro ocorreu durante a execução de uma chamada de biblioteca, mas o erro foi recuperado).

Assim, definir errno para 0 antes de "iniciar o programa" não é necessário, e eu não seguiria esse conselho.

More, I read that it is better to store the error number to the local variable and then to check it

Sim! Sua observação sobre printf() ser capaz de anular errno está correta. Se seu valor precisar ser preservado, ele deve ser copiado para uma variável local o mais rápido possível após o erro ocorrer.

Question 2 : Does the above statement applies to perror() and strerror() , because they are also system calls , and there is possibility that the error occurred with them too.

perror() provavelmente não chama nada que modifique errno , mas se isso acontecer, deve ter o cuidado de copiar o valor de errno antes que isso aconteça. Tenho certeza que você pode assumir que perror() funciona corretamente no seu sistema!

strerror() não precisa se preocupar com isso, pois leva o número do erro como um parâmetro, por isso, mesmo onde o valor de errno já foi salvo.

In Advanced Programming in the UNIX Environment by Richard Stevens , I read that we should examine the value of errno, only when the return value from a function indicates that an error occurred. I do not understand why ?

Como as chamadas de sistema e de biblioteca que definem errno na falha não são necessárias para configurá-la como bem-sucedida, ela retém o valor que tinha antes.

    
por 03.03.2015 / 13:16
1

Responda à questão 1, por que devemos definir errno para 0 no início do programa é que em algum momento algum idiota pode modificar o programa e usar o valor errno sem verificar que a chamada do sistema anterior falhou ( errno é definido somente após falha, não é redefinido como 0 em caso de sucesso).

perror() e strerror() são não chamadas do sistema, são funções da biblioteca. Eles terão o cuidado de preservar o valor original de errno no momento em que forem chamados. (Na verdade, strerror() pode ser uma macro ( #define ), por isso só deve ser chamado quando você sabe que errno tem um valor válido.)

    
por 03.03.2015 / 13:20