2010-04-14 20 views
13

Básicamente tengo que escribir un clon del comando ls de UNIX para una clase, y tengo casi todo funcionando. Una cosa que parece que no sé cómo hacer es verificar si un archivo es un enlace simbólico o no. Desde la página man para stat(), veo que hay un valor mode_t definido, S_IFLNK.¿Cómo se determina el uso de stat() si un archivo es un enlace simbólico?

Ésta es la forma en que estoy tratando de comprobar si un archivo es un sim-enlace, sin suerte (nota, stbuf es el buffer que stat() devuelven los datos de inodos en):

switch(stbuf.st_mode & S_IFMT){ 
    case S_IFLNK: 
     printf("this is a link\n"); 
     break; 
    case S_IFREG: 
     printf("this is not a link\n"); 
     break; 
} 

Mi código SIEMPRE imprime this is not a link, incluso si lo es, y sé de hecho que dicho archivo es un enlace simbólico ya que el comando ls real lo dice, además he creado el enlace simbólico ...

¿Alguien puede detectar lo que yo pueda? estar haciendo mal? ¡Gracias por la ayuda!

+2

Citando de mi página de manual de stat (2): lstat() es idéntica a stat(), excepto que si la ruta es un enlace simbólico, entonces el enlace en sí mismo es stat-ed, no el archivo al que se refiere. – Philip

Respuesta

21

No puede.

Necesita usar lstat() para establecer el enlace, stat() seguirá el enlace y nunca "verá" el enlace.

+0

Entonces, ¿por qué usaría el comando stat()? Simplemente intenté usar lstat() y parece que proporciona la misma información, excepto que maneja enlaces. ¿Usarías stat() solo cuando sabes que no estás tratando con ningún sym-link? – hora

+3

También lo usa cuando trabaja con enlaces simbólicos, muchas veces no le importa si la ruta es un archivo normal o un enlace, le importa el archivo que se utiliza. Por ejemplo, mtime para el enlace es completamente poco interesante, mtime para el archivo al que apunta el enlace. – wich

+2

'stat()' * * maneja * enlaces, simplemente los maneja de manera diferente - sigue el enlace y le informa sobre el archivo al que apunta (que, como se señala, es a menudo lo que desea). – caf

Cuestiones relacionadas