Macro de la biblioteca C -errno
Biblioteca estándar de C - <errno.h>
Descripción
Macro de la biblioteca Cextern int errnose establece mediante llamadas al sistema, y algunas funciones de biblioteca, en caso de error, indican qué error ocurrió.
errnoEs una macro de la biblioteca estándar de C, definida en<errno.h>el archivo de cabecera. Se utiliza para indicar los errores que ocurren durante la ejecución del programa.errnoEn realidad es una variable entera que almacena el código de error. Cuando ocurre un error, las funciones de biblioteca establecenerrnoal código de error apropiado para que el programa pueda comprobar y manejar estos errores.
Declaración
La siguiente es la declaración de la macro errno.
extern int errno
Parámetros
- NA
Valor de retorno
- NA
UsoerrnoPasos
- Incluir el archivo de cabecera: antes de usar
errnoes necesario incluir el<errno.h>archivo de cabecera. - Llamar a la función: llame a funciones que pueden establecer
errnoerrno. - Comprobar
errno: cuando la función devuelve un error, compruebeerrnopara obtener el tipo de error. - Manejar el error: según
errnoel valor, tome las medidas adecuadas de manejo de errores.
Ejemplo
El siguiente ejemplo demuestra el uso de la macro errno.
Ejemplo
Compilemos y ejecutemos el programa anterior, cuando el archivofile.txtno exista, se producirá el siguiente resultado:
Value of errno: 2 Error opening file: No such file or directory
ComuneserrnoValor
EPERM: Operación no permitidaENOENT: No existe el archivo o directorioESRCH: No existe el procesoEINTR: Llamada al sistema interrumpidaEIO: Error de entrada/salidaENXIO: No existe el dispositivo o la direcciónE2BIG: Lista de argumentos demasiado largaENOMEM: Memoria insuficienteEACCES: Permiso denegadoEFAULT: Dirección incorrectaEBUSY: Recurso ocupadoEEXIST: El archivo ya existeEXDEV: Enlace entre dispositivosENODEV: No existe el dispositivoENOTDIR: No es un directorioEISDIR: Es un directorioEINVAL: Argumento inválidoENFILE: Tabla de archivos del sistema llenaEMFILE: Demasiados archivos abiertosENOTTY: No es un dispositivo de terminalETXTBSY: Archivo de texto ocupadoEFBIG: Archivo demasiado grandeENOSPC: Sin espacio en el dispositivoESPIPE: Direccionamiento ilegalEROFS: Sistema de archivos de solo lecturaEMLINK: Demasiados enlacesEPIPE: Tubería rota
Precauciones
- Seguridad de hilos: En entornos de subprocesos múltiples,
errnogeneralmente se implementa como almacenamiento local de hilos (Thread-Local Storage, TLS), lo que garantiza que cada hilo tenga unerrnovalor. - Valor inicial: Cuando una llamada a función tiene éxito,
errnogeneralmente no se modifica. Por lo tanto, antes de manejar errores, asegúrese de queerrnose establezca en 0. - Diferencias entre plataformas: Diferentes sistemas operativos e implementaciones de la biblioteca estándar de C pueden definir códigos de error adicionales. El programa debe evitar depender del valor numérico de códigos de error específicos.
Sugerencias para el manejo de errores
- Comprobar el valor de retorno: Siempre compruebe el valor de retorno al llamar a funciones que pueden fallar.
- Establecer
errnoen 0: Antes de llamar a una función, puede establecererrnoen 0, para comprobar después de la llamada sierrnoha sido modificado. - Usar
strerroryperror:strerrorla función para convertirerrnoen una cadena de mensaje de error legible;perrorla función imprime elerrnovalor con un mensaje de error descriptivo.
Manejo detallado de errores
A continuación se muestra un ejemplo más detallado que demuestra cómo manejar diferenteserrnovalores:
Ejemplo
#include <errno.h>
#include <string.h>
int main() {
FILE *file = fopen("nonexistent_file.txt", "r");
if (file == NULL) {
switch (errno) {
case EACCES:
printf("Error: Permission denied\n");
break;
case ENOENT:
printf("Error: No such file or directory\n");
break;
default:
printf("Error opening file: %s\n", strerror(errno));
}
return 1;
}
// Código de manejo de archivos
fclose(file);
return 0;
}
En este ejemplo, comprobamos los valores específicos deerrnoy realizamos el manejo correspondiente. SierrnoSíEACCES(permiso denegado) oENOENT(no existe el archivo o directorio), imprimimos un mensaje de error específico; de lo contrario, imprimimos un mensaje de error genérico.
<errno.h>Proporciona una forma estandarizada de informar y manejar errores en el programa, haciendo que el código de manejo de errores sea más consistente y mantenible.