[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