c - perror - stderr>( errno
¿Debo configurar errno? (6)
De: http://support.sas.com/documentation/onlinedoc/sasc/doc700/html/lr1/errno.htm
Los únicos valores portátiles para
errno
sonEDOM
yERANGE
Entonces eso responde su pregunta de portabilidad.
Estoy escribiendo un módulo que exporta una interfaz similar a send
y recv
.
Como se supone que esas funciones devuelven, respectivamente, el número de bytes enviados y recibidos, no puedo realizar una gestión de errores adecuada como lo haría normalmente (es decir, utilizando enumerativos y devolviendo valores mnemotécnicos).
En una situación como esta, ¿debo establecer errno
como lo hace la biblioteca estándar? Si es así, dado que errno
es específico de un hilo, ¿hay alguna manera particular de escribir sobre él, o simplemente puedo asignarle un valor?
Editar: experimentándolo noté que el ajuste errno
por asignación está funcionando. Aún así: ¿es esto seguro y portátil para cualquier sistema?
En realidad, es probable que pueda hacer una gestión de errores "adecuada" (como usted dice) ya que devuelve un int
.
Simplemente use valores no negativos para la cantidad de bytes leídos o escritos y valores negativos para códigos de error. No tiene que limitarse a -1
:
enum myerrors {
ERR_NO_MEMORY = -1,
ERR_BAD_ARGS = -2,
ERR_CPU_EXPLODED = -3,
// and so on
};
Sin embargo, configurar el errno
de la manera que desee es válido. El estándar establece que errno
expande a un valor l modificable, lo que significa que puede establecerlo. Desde C1x/n1425, 7.5 Errors <errno.h>
:
... y
errno
que se expande a un lvalue modificable que tiene tipo int, cuyo valor se establece en un número de error positivo por varias funciones de la biblioteca.
Esto es un poco viejo, pero errno - la sección manual 3 dice que puedes asignarlo directamente, a pesar de que es una macro, y será hilo local
No solo puedes configurar errno
, en muchos casos debes establecer errno
. Cuando llame a algunas funciones de la biblioteca, solo podrá detectar un error de manera confiable si primero establece errno
en cero. Ver strtol
para un ejemplo .
De la especificación POSIX de strtol
:
[CX] [Option Start] La función strtol () no cambiará la configuración de errno si tiene éxito.
Dado que 0, {LONG_MIN} o {LLONG_MIN}, {LONG_MAX} o {LLONG_MAX} se devuelven por error y también son válidos los retornos en caso de éxito, una aplicación que desee verificar situaciones de error debería establecer errno en 0, luego llamar a strtol () o strtoll (), luego revisa errno. [Opción final]
Puede asignarle un valor a errno
, pero tenga en cuenta que hay otras maneras de señalar un error que, según su situación, puede ser más adecuado:
- No devuelva la cantidad de bytes leídos, sino un parámetro de salida con tipo
int *
(osize_t *
o lo que sea que use). A continuación, puede devolver un código de error. - Suponiendo que su tipo de devolución es un tipo firmado y que una cantidad negativa de bytes enviados o recibidos no tiene sentido, use valores negativos para señalar las condiciones de error respectivas.
Sí, puede asignarlo, y sí, la tarea será segura para subprocesos. Ver Is errno thread-safe?