2012-03-25 13 views
34

Estoy escribiendo un módulo que exporta una interfaz similar a send y recv.¿Debo configurar errno?

Dado que 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, usando enumeraciones y devolviendo valores mnemotécnicos).

En una situación como esta debería establecer errno como lo hace la biblioteca estándar? Si es así, dado que el errno es específico del hilo, ¿hay alguna manera particular de escribir en él, o simplemente puedo asignarle un valor?

Edit: experimentándolo Noté que el ajuste errno por asignación está funcionando. Aún así: ¿es esto seguro y portátil para cualquier sistema?

+4

Durante más de lo que siempre quiso saber sobre 'errno' y los estándares de C, ver http://stackoverflow.com/questions/12945486/ – Nemo

Respuesta

28

Esto es un poco viejo, pero errno - manual section 3 dice que se puede asignar directamente a ella, a pesar de que es una macro, y va a ser flujos locales

+0

No tiene nada de extraño :-) La norma establece que se expande a un valor l modificable. – paxdiablo

7

En realidad, es probable que puede hacer "adecuada" (como usted dice) gestión de errores, ya que devuelve un int.

Simplemente use valores no negativos para el número de bytes leídos o escritos y valores negativos para códigos de error. Usted no tiene por qué limitarse a -1:

enum myerrors { 
    ERR_NO_MEMORY = -1, 
    ERR_BAD_ARGS  = -2, 
    ERR_CPU_EXPLODED = -3, 
    // and so on 
}; 

Sin embargo, el establecimiento de errno de la manera que queremos es válido. La norma establece que errno se expande a un valor l modificable, lo que significa que puede establecerlo. De C1x/n1425, 7.5 Errors <errno.h>:

... errno y que se expande a un valor-modificable que tiene el tipo int, cuyo valor se establece en un número de error positivo por varias funciones de biblioteca.

+0

punto de Feria (de hecho, en algún momento vuelvo - 2) – Dacav

2

Desde: http://support.sas.com/documentation/onlinedoc/sasc/doc700/html/lr1/errno.htm

El únicos valores portátiles para errno son EDOM y ERANGE

para que las respuestas de su po pregunta de Irtability.

+0

Estaba más interesado en los detalles técnicos de asignarlo, ¡pero no esperaba este tipo de problema de portabilidad! :) – Dacav

+1

@Dacav - No creo que haya alguna manera especial de configurarlo ... solo puede asignarlo ... Utilizaría los valores de enumeración dados definidos en 'errno.h' si es posible. – prelic

+3

Esa lista no está del todo completa, 'EILSEQ' es un mandato de la norma. – paxdiablo

6

Usted sólo puede asignar un valor a errno, pero tenga en cuenta que hay otras maneras de señalar un error que, dependiendo de su situación, puede ser más adecuado:

  1. no devuelve el número de los bytes se leen, pero en su lugar tienen 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, utilice valores negativos para señalar las condiciones de error respectivas.
+0

'errno' es utilizado por casi todas las funciones en POSIX (excepto las que devuelven el código de error y algunas excepciones raras), no solo por cuestiones de bajo nivel. –

+0

De acuerdo, eliminé esa parte. –

11

No sólo puede configurar errno, en muchos casos se debe establecer errno. Cuando llame a algunas funciones de la biblioteca, solo podrá detectar un error de manera confiable si establece errno en cero. See strtol for an example.

De la especificación POSIX de strtol:

[CX] función [Opción Inicio] El strtol() no deberá cambiar la configuración de errno si tiene éxito.

Dado que 0, {LONG_MIN} o {LLONG_MIN}, y {LONG_MAX} o {LLONG_MAX} se devuelven por error y también son válidas las devoluciones exitosas, una aplicación que desee verificar situaciones de error debería establecer errno en 0, luego llama a strtol() o strtoll(), luego revisa errno. [Fin Opción]

Cuestiones relacionadas