Saltar para o conteúdo

A Biblioteca C GNU/Mensagens de erro

Origem: Wikilivros, livros abertos por um mundo aberto.

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)

[editar | editar código-fonte]

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

[editar | editar código-fonte]

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)

[editar | editar código-fonte]

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

[editar | editar código-fonte]

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)

[editar | editar código-fonte]

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

[editar | editar código-fonte]

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);
           }
           (...)
     }
     (...)
}