access () dice que el file existe pero fopen () dice que no

Tengo un progtwig de CA que está tratando de leer en un file. Usando el command access() dice que el file está ahí pero fopen() devuelve NULL y errno dice que el file no existe.

Un fragment truncado de código:

  FILE *fp; char *filename = strdup(git_dir); strcat(filename, "/HEAD"); printf(git_dir); printf(":"); printf(filename); printf(":"); if (access(filename, F_OK)) { printf("YU NO OPEN:"); } fp = fopen(filename, "r"); if (fp == NULL) { printf(strerror(errno)); return; } 

Como puede ver en el código, esto está intentando abrir el file .git / HEADS de un repository de git. El repository particular al que está fallando se clonó en un subdirectory de otro repository y luego se agregó como un submodule. No tengo problemas que fueron clonados ejecutando el command de git submodule update .

El código anterior no imprime "YU NO ABRIR:" pero imprime el strerror() . Imprimí el nombre del file en la pantalla y abrí el file con less y se abre bien. Este progtwig está generando mi prompt de zsh, entonces me imagino que lo está ejecutando mi usuario, y los permissions en el file son

 -rw-r--r-- 1 ben users 23 Jun 30 13:32 HEAD 

¿Alguna sugerencia?

No puedes hacer esto:

 char *filename = strdup(git_dir); strcat(filename, "/HEAD"); 

Está agregando la cadena "/ HEAD" al nombre del file, pero el nombre de file solo tiene espacio para el contenido de git_dir . Por lo tanto, está escribiendo más allá del búfer, sobrescribiendo la memory y posiblemente causando esgulps, y todo tipo de comportamiento impnetworkingecible puede ocurrir.

Haz esto en su lugar:

 char *filename = malloc(strlen(git_dir) + 6); //length of /HEAD + null terminator strcpy(filename, git_dir); strcat(filename, "/HEAD"); 

Tenga en count que stdout también es normalmente buffer de línea. Esto significa que si printf("YU NO OPEN:"); , es posible que no vea la salida de inmediato. Imprima una nueva línea, \ n, para purgar la salida.