Ao ligar execl(...)
, recebo um errno=2
. O que isso significa? Como posso saber o significado disso errno
?
221
Você pode usar strerror()
para obter uma sequência legível por humanos para o número do erro. Essa é a mesma sequência impressa, perror()
mas é útil se você estiver formatando a mensagem de erro para algo diferente da saída de erro padrão.
Por exemplo:
#include <errno.h>
#include <string.h>
/* ... */
if(read(fd, buf, 1)==-1) {
printf("Oh dear, something went wrong with read()! %s\n", strerror(errno));
}
O Linux também suporta a variante explicitamente segura de threads strerror_r()
.
strerror()
não é seguro para thread enquantostrerror_r()
estiver seguro para thread. As funções MT-Safe ou Thread-Safe são seguras para chamar na presença de outros threads. MT, no MT-Safe, significa Multi Thread. -p26, Biblioteca GNU Cchar * strerror(int errnum )
[Função] Preliminar: | Corrida MT-insegura: strerror | Pilha i18n insegura | Mem-inseguro AC | Consulte a Seção 1.2.2.1 [Conceitos de segurança POSIX], página 2. -p58, A biblioteca GNU Cerrno
é seguro para threads. Olhe:#define errno *__errno_location()
errno
, o GNU libcstrerror
grava no buffer global interno . Nem sempre faz isso, mas em alguns casos faz. Você substituirá esse buffer enquanto outro thread o estiver lendo.errno
, nãostrerror()
.Em vez de executar
perror
qualquer código de erro obtido, você pode recuperar uma lista completa deerrno
valores em seu sistema com a seguinte linha:cpp -dM /usr/include/errno.h | grep 'define E' | sort -n -k 3
fonte
No Linux, há também uma ferramenta muito elegante que pode dizer imediatamente o que cada código de erro significa. No Ubuntu:
apt-get install errno
.Então, se, por exemplo, você deseja obter a descrição do erro tipo 2, basta digitar
errno 2
o terminal.Com
errno -l
você, obtém uma lista com todos os erros e suas descrições. Muito mais fácil do que outros métodos mencionados em pôsteres anteriores.fonte
perror
/strerror
é melhor porque o USUÁRIO não precisa procurar. Embora,errno -l
é melhor para encontrá-los.Aqui está a saída de
errno -l
reformatada para facilitar a leitura:Eu usei tabularise no Vim para alinhar as colunas:
fonte
O código de erro 2 significa "Arquivo / diretório não encontrado". Em geral, você pode usar a função perror para imprimir uma sequência legível por humanos.
fonte
Existem algumas funções úteis para lidar com
errno
s. (Só para esclarecer, elas estão embutidas nolibc
- estou apenas fornecendo implementações de amostra porque algumas pessoas acham a leitura do código mais clara do que a leitura em inglês.)strerror
retorna uma string descrevendo o número do erro que você passou para ele. Cuidado, isso não é seguro para threads ou interrupções; é livre reescrever a string e retornar o mesmo ponteiro na próxima chamada. Usestrerror_r
se precisar se preocupar com isso.perror
imprime a mensagem que você enviar, além de uma sequência que descreve a atualerrno
, com erro padrão.fonte
some people find reading code clearer than reading English
verdade.Isso é mais rápido do que procurar o código
errno.h
, mais curto que a maioria das soluções postadas aqui e não requer a instalação de ferramentas de terceiros:perl -E 'say $!=shift' 2
rendimentos
No such file or directory
fonte
-E
trata o seguinte código citado como um script Perl.say
está escrevendo seus argumentos na saída padrão.$!
é uma variável especial que mantém o valor deerrno
. Se usado no contexto da string, gera a string de erro correspondente. O script atribui o valor2
a essa variável usando oshift
comando, que é cortar a cabeça da matriz de argumentos@ARGV
e colocar essa cabeça em seu lugar. A linha de comando também poderia ter sido escrita comoperl -E 'say $!=2'
.Funciona no Solaris.
cc perror.c -o perror
<< use esta linha para compilá-lafonte
perror(NULL);
? Comperror("");
o formato é: ERROR NAME
. Comperror(NULL);
a saída é apenasERROR NAME
Aqui está a documentação . Isso deve lhe dizer o que significa e o que fazer com eles. Você deve evitar usar o valor numérico e usar as constantes listadas também, pois o número pode mudar entre sistemas diferentes.
fonte
errnoname
biblioteca então. Ele cuida da parte tediosa de reunir todos os nomes possíveis de errno em uma função C que pode ser usada apenas trivialmente para obter o nome da macro de errno do número. Usando isso como base, fazer suaperror
variante deve ser rápida e fácil.Eu uso o seguinte script:
fonte
Digite
sudo apt-get install moreutils
e, depois de instalado, digiteerrno 2
. Você também pode usarerrno -l
para todos os números de erro, ou ver apenas os arquivos, canalizando-a paragrep
, como este:errno | grep file
.fonte
Ligar
em caso de erro.
Amostra:
As páginas de manual
errno(3)
eperror(3)
são interessantes também ...fonte
Quando você usa strace (no Linux) para executar seu binário, ele gera os retornos das chamadas do sistema e o que significa o número do erro. Às vezes, isso pode ser útil para você.
fonte
Eu tenho a seguinte função no meu arquivo .bashrc - ele procura o valor errno dos arquivos de cabeçalho (pode ser
/usr/include/errno.h
,/usr/include/linux/errno.h
etc., etc.)Funciona se os arquivos de cabeçalho estiverem instalados na máquina ;-)
Normalmente, o arquivo de cabeçalho tem um erro + a seguir vem a explicação no comentário; algo do seguinte:
./asm-generic/errno-base.h:#define EAGAIN 11 / * Tente novamente * /
fonte
Isso significa:
fonte