A Biblioteca C GNU/Mensagens de erro
A biblioteca possui funções e variáveis projetadas para tornar fácil para seus programas reportarem mensagens de erro informativas em formato padronizado a respeito da falha de uma chamada de biblioteca. As funções strerror e perror dão à você uma mensagem de erro padrão para um determinado código de erro; a variável program_invocation_short_name dá à você acesso conveniente ao nome do programa que encontrou o erro.
A Função: char *strerror(int errnum)
Esta função recebe um número inteiro que contém o código de algum erro. Normalmente, o que é passada para esta função é a variável errno vista anteriormente. Após receber um número inteiro, a função retorna um ponteiro para uma string que possui uma descrição rápida do erro que aconteceu.
Você não deve tentar alterar o valor da string retornada. Evite realizar múltiplas chamadas sucessivas à função strerror, pois isso pode sobrescrever a string. (Não se preocupe, pois nenhuma outra função de biblioteca chama esta função. Você é o único que pode chamá-la).
Caso nada tenha dado de errado no sistema, a string retornada pela função é "Sucess". Caso contrário, será outra mensagem dizendo uma descrição rápida do erro.
Esta função é declarada em string.h.
Exemplos de Uso
O editor de textos Emacs possui uma função própria chamada emacs_strerror. Esta função é implementada com a ajuda da função strerror da Biblioteca C GNU:
char *emacs_strerror(error_number){ char *str; (...) str = strerror (error_number); (...) return str; }
A Função: char *strerror_r(int errnum, char *buf, size_t n)
Esta função funciona assim como strerror, mas ao invés de retornar a mensagem de erro em um buffer alocado estaticamente compartilhado por todas as linhas de execução de um processo, ela retorna uma cópia privada para a linha de execução. Esta, pode ser tanto algum dado global permanente ou uma string de mensagem no buffer fornecido pelo usuário começando no endereço buf e que possui um tamanho de n bytes.
No máximo, n caracteres são escritos (incluindo o bite "\0"), então você deve passar como argumento um buffer grande o bastante.
Esta função deve sempre ser usada em programas com várias linhas de execução, já que não há garantias de que a string retornada por strerror realmente pertença à última chamada da linha de execução atual.
Esta função é declarada em string.h.
Exempos de Uso
O seguinte exemplo aparece no código usado por vários comandos básicos do Linux, como "cat", "cut", etc.
(...) #include <string.h> (...) #include <errno.h> (...) # define __strerror_r strerror_r (...) static void print_errno_message (int errnum){ char const *s; (...) char errbuf[1024]; s = __strerror_r (errnum, errbuf, sizeof errbuf); (...) fprintf (stderr, ": %s", s); }
A Função: void perror(const char *message)
Esta função imprime uma mensagem de erro na saída de erros stderr. A orientação de stderr não pode ser mudada para outra saída.
Se você chamar perror com uma mensagem que é um ponteiro nulo ou uma string vazia, perror apenas imprime na tela uma mensagem correspondente ao valor de errno, adicionando uma quebra de linha.
Se você fornecer para a função uma mensagem não nula como argumento, então perror imprime a sua mensagem antes da mensagem de erro padrão, colocando um ":" para separá-las.
A mensagem impressa é exatamente a mesma mensagem que é retornada por strerror. O conteúdo da mensagem pode variar dependendo do sistema. Nos sistemas GNU, as mensagens são sempre curtas, ocupam uma única linha, começam com uma letra maiúscula e não possuem nenhuma pontuação.
Esta função é declarada em stdio.h.
Exemplos de Uso
O exemplo abaixo foi retirado do código-fone do Emacs:
int main(argc, argv) int argc; char *argv; { (...) while(1){ double avg[3]; int loads; errno=0; loads = getloadavg (avg, 3); if (loads == -1){ perror ("Error getting load average"); exit (1); } (...) } (...) }