Cuando llamo execl(...)
, recibo un errno=2
. Qué significa eso? ¿Cómo puedo saber el significado de esto errno
?
221
Puede usar strerror()
para obtener una cadena legible por humanos para el número de error. Esta es la misma cadena impresa perror()
pero es útil si está formateando el mensaje de error para algo que no sea la salida de error estándar.
Por ejemplo:
#include <errno.h>
#include <string.h>
/* ... */
if(read(fd, buf, 1)==-1) {
printf("Oh dear, something went wrong with read()! %s\n", strerror(errno));
}
Linux también admite la variante explícitamente segura para subprocesos strerror_r()
.
strerror()
no es seguro para hilos mientrasstrerror_r()
es seguro para hilos. Las funciones MT-Safe o Thread-Safe son seguras para llamar en presencia de otros hilos. MT, en MT-Safe, significa Multi Thread. -p26, La Biblioteca GNU Cchar * strerror(int errnum )
[Función] Preliminar: | Carrera MT-insegura: strerror | AS-Inseguro montón i18n | AC-Inseguro mem | Consulte la Sección 1.2.2.1 [Conceptos de seguridad POSIX], página 2. -p58, The GNU C Libraryerrno
es seguro para subprocesos. Mira:#define errno *__errno_location()
errno
, GNU libcstrerror
escribe en el búfer global interno . No siempre hace esto, pero en algunos casos lo hace. Sobreescribirá ese búfer mientras otro hilo lo está leyendo.errno
, nostrerror()
.En lugar de ejecutar
perror
cualquier código de error que obtenga, puede recuperar una lista completa deerrno
valores en su sistema con la siguiente línea:cpp -dM /usr/include/errno.h | grep 'define E' | sort -n -k 3
fuente
En Linux también hay una herramienta muy ordenada que puede decir de inmediato qué significa cada código de error. En Ubuntu:
apt-get install errno
.Entonces, si por ejemplo desea obtener la descripción del tipo de error 2, simplemente escriba
errno 2
el terminal.Con
errno -l
usted obtendrá una lista con todos los errores y sus descripciones. Mucho más fácil que otros métodos mencionados en carteles anteriores.fuente
perror
/strerror
es mejor porque entonces el USUARIO no tiene que buscarlo. Aunque,errno -l
es mejor encontrarlos.Aquí está el resultado de
errno -l
reformateado para facilitar la lectura:Usé tabularise en Vim para alinear las columnas:
fuente
El código de error 2 significa "Archivo / Directorio no encontrado". En general, puede usar la función perror para imprimir una cadena legible por humanos.
fuente
Hay algunas funciones útiles para tratar con
errno
s. (Solo para que quede claro, estos están integrados enlibc
- Solo proporciono implementaciones de muestra porque algunas personas encuentran que leer códigos es más claro que leer inglés).strerror
devuelve una cadena que describe el número de error que le ha pasado. Precaución, esto no es a prueba de hilos o interrupciones; es libre de reescribir la cadena y devolver el mismo puntero en la próxima invocación. Úselostrerror_r
si necesita preocuparse por eso.perror
imprime el mensaje que le da, más una cadena que describe el actualerrno
, al error estándar.fuente
some people find reading code clearer than reading English
verdad.Esto es más rápido que buscar el código
errno.h
, más corto que la mayoría de las soluciones publicadas aquí y no requiere la instalación de herramientas de terceros:perl -E 'say $!=shift' 2
rendimientos
No such file or directory
fuente
-E
trata el siguiente código citado como un script Perl.say
está escribiendo sus argumentos a la salida estándar.$!
es una variable especial que contiene el valor deerrno
. Si se usa en contexto de cadena, produce la cadena de error correspondiente. El script asigna el valor2
a esta variable mediante elshift
comando, que corta el encabezado de la matriz de argumentos@ARGV
y coloca este encabezado en su lugar. La línea de comando también podría haberse escrito comoperl -E 'say $!=2'
.Funciona en Solaris.
cc perror.c -o perror
<< usa esta línea para compilarlofuente
perror(NULL);
? Conperror("");
su formato es: ERROR NAME
. Conperror(NULL);
su salida es soloERROR NAME
Aquí está la documentación . Eso debería decirle qué significa y qué hacer con ellos. Debe evitar usar el valor numérico y usar las constantes que figuran allí también, ya que el número puede cambiar entre diferentes sistemas.
fuente
errnoname
biblioteca entonces. Se encarga de la parte tediosa de reunir todos los nombres posibles de errno en una función C que se puede usar trivialmente para obtener el nombre de macro errno del número. Usando eso como base, hacer que superror
variante sea rápida y fácil.Yo uso el siguiente script:
fuente
Escriba
sudo apt-get install moreutils
y luego una vez que se haya instalado, escribaerrno 2
. También se puede utilizarerrno -l
para todos los números de error, o ver sólo los archivos mediante la canalización quegrep
, como esto:errno | grep file
.fuente
Llamada
en caso de error
Muestra:
Las páginas de manual de
errno(3)
y tambiénperror(3)
son interesantes ...fuente
Cuando usa strace (en Linux) para ejecutar su binario, generará los retornos de las llamadas del sistema y lo que significa el número de error. Esto a veces puede ser útil para usted.
fuente
Tengo la siguiente función en mi archivo .bashrc - se consulta el valor de errno a partir de los archivos de cabecera (puede ser cualquiera
/usr/include/errno.h
,/usr/include/linux/errno.h
etc., etc.)Funciona si los archivos de encabezado están instalados en la máquina ;-)
Por lo general, el archivo de encabezado tiene un error + luego viene la explicación en el comentario; algo de lo siguiente:
./asm-generic/errno-base.h:#define EAGAIN 11 / * Inténtalo de nuevo * /
fuente
Significa:
fuente