strerror perror funciones c errno

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 son EDOM y ERANGE

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:

  1. No devuelva la cantidad de bytes leídos, sino un parámetro de salida con tipo int * (o size_t * o lo que sea que use). A continuación, puede devolver un código de error.
  2. 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.