<div dir="ltr">El 14 de mayo de 2013 16:04, Salvador Pozo <span dir="ltr"><<a href="mailto:salvador@conclase.net" target="_blank">salvador@conclase.net</a>></span> escribió:<br><div class="gmail_extra"><div class="gmail_quote">
<blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">Hola, Carlos:<br>
<br>
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. :)<br>

<br>
Hasta pronto.<br>
<span class=""><font color="#888888"><br></font></span></blockquote><div><br></div><div style>Buenas Salvador,</div><div style><br></div><div style>Ante todo gracias por contestar.</div><div style><br></div><div style>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).</div>
<div style><br></div><div style>Te adjunto una traza de GDB donde se puede comprobar como la variable errno cambia sin motivo aparente:</div><div style><br></div><div style> Breakpoint 1, create_config () at config.c:7</div>
<div>7           char *buffer=NULL;</div><div>(gdb) n</div><div>8           size_t linecap=0;</div><div>(gdb) </div><div>10          errno=0;</div><div>(gdb) </div><div>11          fd=open(CONFIG_FILE, O_CREAT | O_EXCL | O_WRONLY, S_IRUSR | S_IWUSR);</div>
<div>(gdb) p errno       <----------------------------------------- ESTE ES EL VALOR DE ERRNO JUSTO ANTES DE LLAMAR A OPEN</div><div>$4 = 0</div><div>(gdb) n         <------------------------------------------------ EJECUTAMOS OPEN</div>
<div>17          if(fd<0) {</div><div>(gdb) p errno   <--------------------------------------------- COMPROBAMOS QUE EL VALOR DE ERRNO ES 17 (COMO ESPERABAMOS)</div><div>$5 = 17</div><div>(gdb) n</div><div>18              printf("El valor de errno es %d\n",errno);     <------------------------------- EJECUTAMOS PRINTF Y MOSTRAMOS EL VALOR DE ERRNO (17, EL ESPERADO)</div>
<div>(gdb) p errno</div><div>$6 = 17</div><div>(gdb) n</div><div>El valor de errno es 17</div><div>19              if(errno==EEXIST)        <----------------------------- SIGUIENTE LINEA DE EJECUCION TRAS EL PRINTF, UN IF(QUE AUN NO SE HA EJECUTADO). ERRNO VALE 2</div>
<div>(gdb) p errno</div><div>$7 = 2</div><div><br></div><div style>Como puedes ver, tras el printf y antes de ejecutar cualquier otra sentencia el valor de errno ha cambiado de 17 a 2.</div><div style><br></div><div style>
Saludos.</div></div></div></div>