[C con Clase] Problemas con variable errno

Carlos decvt100 en gmail.com
Mar Mayo 14 13:57:29 CEST 2013


Buenas lista,

Estoy haciendo un programita simple pero me estoy encontrando con un error
extraño con respecto a la variable errno.

Hasta donde tengo entendido, la variable errno es una variable declarada en
el fichero errno.h y la cual ciertas funciones cambian su valor para
identificar el error real.

Os pongo el fragmento de código en el cual estoy teniendo el problema:

int create_config(void) {
    int fd;
    char *buffer=NULL;
    size_t linecap=0;
    extern int errno;
    errno=0;
    fd=open(CONFIG_FILE, O_CREAT | O_EXCL | O_WRONLY, S_IRUSR | S_IWUSR);
    //perror("Que cojones pasa");
    printf("El valor de errno es %d\n",errno);
    printf("Creando el fichero %s\n",CONFIG_FILE);
    printf("El valor de fd es %d\n",fd);
    perror("Que cojones pasa");
    if(fd<0) {
        printf("El valor de errno es %d\n",errno);
        if(errno==EEXIST)
            return 1;
        else
            return 2;
    }


La salida de este fragmento de código es la siguiente:

El valor de errno es 17
Creando el fichero /usr/home/carlos/etc/test.cfg
El valor de fd es -1
Que cojones pasa: No such file or directory
El valor de errno es 2

Como podéis comprobar, en un principio open cambia la variable errno al
valor correcto (17, que quiere decir que el fichero ya existe), sin embargo
a la hora de ejecutar la sentencia perror("Que cojones pasa") la salida ya
es No such file or directory, lo cual es un valor de errno de 2 (como
compruebo despues del if).

Hasta donde yo se, printf y perror no cambian el valor de errno y no hay
punteros ni nada extraño que haga modificar el programa de una forma no
deseada (solo son 3 printfs,perror).

Como nota curiosa, si descomento el primer perror justo despues de la
llamada a open, la ejecución del fragmento de código es correcta, errno
siempre vale 17.


El entorno que trabajo es el siguiente:

Programa single thread.

gcc -v
Using built-in specs.
Target: amd64-undermydesk-freebsd
Configured with: FreeBSD/amd64 system compiler
Thread model: posix
gcc version 4.2.1 20070831 patched [FreeBSD]


Gracias por vuestro tiempo

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


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