Pregunta

Tengo el siguiente código sólo una parte de ella se muestra aquí y estoy comprobando si un tipo de archivo.

struct stat *buf /* just to show the type buf is*/ 

switch (buf.st_mode & S_IFMT) {
     case S_IFBLK:  printf(" block device\n");            break;
     case S_IFCHR:  printf(" character device\n");        break;
     case S_IFDIR:  printf(" directory\n");               break;
     case S_IFIFO:  printf(" FIFO/pipe\n");               break;
     case S_IFLNK:  printf(" symlink\n");                 break;
     case S_IFREG:  printf(" regular file\n");            break;
     case S_IFSOCK: printf(" socket\n");                  break;
     default:       printf(" unknown?\n");                break;
}

El problema:. Valor de st_mode obtenido cuando hago un printf("\nMode: %d\n",buf.st_mode); el resultado es 33 188

He probado mi programa con un tipo de archivo normal y un enlace simbólico. En ambos casos el resultado fue "archivo normal" es decir el caso enlace simbólico está fallando y no llego a entender por qué?

¿Fue útil?

Solución

Desde la página del stat (2) :

stat() estadísticas del archivo apuntado por camino y rellenos en buf.

lstat() es idéntica a stat(), excepto que si la ruta es un enlace simbólico, entonces el enlace en sí es stat-ed, no el archivo que se refiere a.

En otras palabras, la llamada stat seguirá el enlace simbólico al archivo de destino y recuperar la información para que. Trate de usar lstat en cambio, se le dará la información para el Enlace .


Si lo hace lo siguiente:

touch junkfile
ln -s junkfile junklink

a continuación, compilar y ejecutar el programa siguiente:

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>

int main (void) {
    struct stat buf;
    int x;

    x = stat ("junklink", &buf);
    if (S_ISLNK(buf.st_mode)) printf (" stat says link\n");
    if (S_ISREG(buf.st_mode)) printf (" stat says file\n");

    x = lstat ("junklink", &buf);
    if (S_ISLNK(buf.st_mode)) printf ("lstat says link\n");
    if (S_ISREG(buf.st_mode)) printf ("lstat says file\n");

    return 0;
}

obtendrá:

 stat says file
lstat says link

como se esperaba.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top