Programação em C

Cabeçalho errno.h na Linguagem C

Pontos principais

  • O cabeçalho errno.h define macros para relatar erros na linguagem C através da variável global ou thread-local errno.
  • No início da execução do programa, o valor armazenado em errno é zero.
  • A norma ISO C exige apenas um número mínimo de macros de erro, enquanto sistemas POSIX expandem consideravelmente essa lista.

O errno.h é um arquivo de cabeçalho pertencente à biblioteca padrão da linguagem de programação C. Sua principal finalidade é definir macros voltadas para o relato e a recuperação de condições de erro ocorridas durante a execução de funções do sistema ou da biblioteca, utilizando o símbolo errno, abreviação para error number (número do erro).

Funcionamento do Errno

O identificador errno atua de forma semelhante a uma variável inteira. Quando determinadas funções da biblioteca detectam falhas em suas operações, elas armazenam um valor numérico específico dentro de errno. No momento da inicialização do programa, o valor armazenado é zero, e as funções da biblioteca apenas gravam valores estritamente maiores do que zero.

Vale destacar que qualquer função da biblioteca pode alterar o conteúdo armazenado em errno antes de retornar ao chamador, independentemente de ter detectado um erro ou não. A maioria das funções sinaliza a ocorrência de uma falha retornando um valor especial, tipicamente NULL para funções que retornam ponteiros e -1 para funções que retornam inteiros. Em casos específicos, exige-se que o chamador defina errno como zero antes da chamada e realize o teste posterior para verificar se houve erro.

Implementação e Concorrência

A macro errno expande para um lvalue do tipo int, podendo incluir especificadores de tipo como extern e/ou volatile dependendo da plataforma utilizada. Originalmente, essa estrutura representava uma localização de memória estática. Contudo, em ambientes modernos com suporte a multithreading, utilizam-se quase sempre macros que mapeiam para o armazenamento local de cada thread, assegurando que threads distintas observem seus próprios códigos de erro de forma isolada.

Códigos de Erro Padrão e POSIX

O cabeçalho também define macros que se expandem para constantes inteiras representativas dos códigos de erro. A norma ISO C exige que apenas um conjunto mínimo de valores seja definido, mas sistemas operacionais compatíveis com POSIX — como Linux, AIX e Solaris — incorporam uma ampla gama de outros códigos, a exemplo de EACCES, acionado quando o acesso de leitura a um arquivo é negado. A norma C++11 também adota muitos desses mesmos códigos especificados pelo padrão POSIX.

As normas POSIX determinam os nomes e significados das macros de erro, mas não exigem valores numéricos fixos, embora exista convenção similar entre diferentes versões de sistemas Unix. Dessa forma, recomenda-se que os programas utilizem os nomes padronizados das macros em vez de valores numéricos diretos para garantir portabilidade e legibilidade do código-fonte.

Tradução e Exibição de Erros

É possível converter um código de erro numérico em uma mensagem descritiva textual por meio da função strerror (definida em <string.h>) ou imprimir a descrição diretamente no fluxo padrão de erro utilizando perror (definida em <stdio.h>). Em sistemas do tipo Unix onde a função tradicional strerror pode não ser segura para threads, emprega-se frequentemente a versão thread-safe strerror_r.

Perguntas frequentes

O que significa errno?

Errno é a abreviação de error number (número do erro), um mecanismo utilizado na linguagem C para relatar falhas em funções da biblioteca padrão.

Qual é o valor inicial de errno?

No momento da inicialização do programa, o valor armazenado em errno é zero.

Como converter errno em uma string legível?

É possível utilizar a função strerror para obter a descrição textual do erro ou a função perror para imprimi-la diretamente no fluxo de erro padrão.