[C con Clase] Problemas con variable errno

Carlos decvt100 en gmail.com
Mie Mayo 15 12:19:04 CEST 2013


El 14 de mayo de 2013 16:04, Salvador Pozo <salvador en conclase.net> escribió:

> Hola, Carlos:
>
> A ver si puede responderte alguien que pueda probarlo bajo linux. Yo he
> probado en Windows y no puedo reproducir el error, errno siempre vale 17,
> independientemente de que comente o no la línea "perror". Bueno, siempre
> menos la primera vez, claro. :)
>
> Hasta pronto.
>
>
Buenas Salvador,

Ante todo gracias por contestar.

Lo problemático de que en windows funcione y en FreeBSD es que o bien estoy
utilizando algo que no esta definido en C pero algunos sistemas asumen un
"comportarmiento por defecto" o existe algún problema extraño a la hora de
compilar o en las bibliotecas o estoy tomando como cierto cosas que
realmente están mal hechas (esto si sería aún más problemático :D).

Te adjunto una traza de GDB donde se puede comprobar como la variable errno
cambia sin motivo aparente:

 Breakpoint 1, create_config () at config.c:7
7           char *buffer=NULL;
(gdb) n
8           size_t linecap=0;
(gdb)
10          errno=0;
(gdb)
11          fd=open(CONFIG_FILE, O_CREAT | O_EXCL | O_WRONLY, S_IRUSR |
S_IWUSR);
(gdb) p errno       <----------------------------------------- ESTE ES EL
VALOR DE ERRNO JUSTO ANTES DE LLAMAR A OPEN
$4 = 0
(gdb) n         <------------------------------------------------
EJECUTAMOS OPEN
17          if(fd<0) {
(gdb) p errno   <--------------------------------------------- COMPROBAMOS
QUE EL VALOR DE ERRNO ES 17 (COMO ESPERABAMOS)
$5 = 17
(gdb) n
18              printf("El valor de errno es %d\n",errno);
<------------------------------- EJECUTAMOS PRINTF Y MOSTRAMOS EL VALOR DE
ERRNO (17, EL ESPERADO)
(gdb) p errno
$6 = 17
(gdb) n
El valor de errno es 17
19              if(errno==EEXIST)        <-----------------------------
SIGUIENTE LINEA DE EJECUCION TRAS EL PRINTF, UN IF(QUE AUN NO SE HA
EJECUTADO). ERRNO VALE 2
(gdb) p errno
$7 = 2

Como puedes ver, tras el printf y antes de ejecutar cualquier otra
sentencia el valor de errno ha cambiado de 17 a 2.

Saludos.
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://listas.conclase.net/pipermail/cconclase_listas.conclase.net/attachments/20130515/adc91185/attachment.html>


Más información sobre la lista de distribución Cconclase