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.