Necesito obtener el nombre de un archivo de un descriptor de archivo dado, dentro de un pequeño módulo de kernel de Linux que escribí. Probé la solución dada en Getting Filename from file descriptor in C, pero por alguna razón, imprime los valores de basura (en el uso de readlink
en /proc/self/fd/NNN
como se menciona en la solución). ¿Cómo puedo hacerlo?¿Cómo puedo obtener un nombre de archivo de un descriptor de archivo dentro de un módulo kernel?
Respuesta
No llame al SYS_readlink
- utilice el mismo método que procfs
cuando se lee uno de esos enlaces. Comience con el código en proc_pid_readlink()
y proc_fd_link()
en fs/proc/base.c
.
En términos generales, dada una int fd
y una struct files_struct *files
de la tarea que le interesa (que usted ha tomado una referencia a), que desea hacer:
char *tmp;
char *pathname;
struct file *file;
struct path *path;
spin_lock(&files->file_lock);
file = fcheck_files(files, fd);
if (!file) {
spin_unlock(&files->file_lock);
return -ENOENT;
}
path = &file->f_path;
path_get(path);
spin_unlock(&files->file_lock);
tmp = (char *)__get_free_page(GFP_KERNEL);
if (!tmp) {
path_put(path);
return -ENOMEM;
}
pathname = d_path(path, tmp, PAGE_SIZE);
path_put(path);
if (IS_ERR(pathname)) {
free_page((unsigned long)tmp);
return PTR_ERR(pathname);
}
/* do something here with pathname */
free_page((unsigned long)tmp);
Si el código se ejecuta en el proceso- contexto (por ejemplo, invocado a través de un syscall) y el descriptor de archivo es del proceso actual, luego puede usar current->files
para la tarea actual struct files_struct *
.
Agradable. Eso funciono. ¡Gracias! Pregunta rápida sin embargo. ¿Para qué sirven las llamadas 'path_get' y' path_put' (porque eliminarlas no tiene mucho efecto en mi programa)? Además, ¿alguna idea de por qué no funcionaría 'sys_readlink'? – Siddhant
@ Siddhant: Las llamadas 'path_get()' y 'path_put()' son necesarias para corregir, ya que fijan la ruta para que no desaparezca mientras tratas de trabajar con ella (todo el 'struct path' contains es un par de punteros, a 'struct vfsmount' y' struct dentry'). – caf
Aha. ¡Gracias de nuevo! – Siddhant
- 1. ¿Cómo obtener un puntero ARCHIVO desde un descriptor de archivo?
- 2. ¿Cómo obtener un nombre de archivo temporal?
- 3. ¿Cómo puedo convertir un puntero de archivo (FILE * fp) a un descriptor de archivo (int fd)?
- 4. ¿Cómo puedo obtener el nivel de batería dentro de un módulo kernel de Linux?
- 5. ¿Cómo obtener una secuencia FILE * desde un descriptor de archivo?
- 6. ¿Fopen crea un descriptor de archivo?
- 7. ¿Cómo puedo encontrar un nombre de archivo, dado un puntero ARCHIVO?
- 8. descriptor de archivo de un std :: fstream
- 9. ¿ftell en un descriptor de archivo?
- 10. ¿Cómo puedo obtener el nombre de una función de llamada dentro de un módulo en Mathematica?
- 11. Leyendo un archivo zip dentro de un archivo jar
- 12. ¿Cómo ejecutar un programa desde el descriptor de archivo?
- 13. ¿Cómo puedo imprimir un conjunto de archivos en un archivo, un nombre de archivo por línea?
- 14. Cómo codificar un módulo kernel de Linux?
- 15. ¿Cómo leer un archivo .properties dentro de un archivo .xsl?
- 16. ¿Cómo puedo obtener un CGImageRef de un archivo?
- 17. En c, ¿cómo hacer que un descriptor de archivo bloquee?
- 18. El uso de un descriptor de archivo numerado desde Java
- 19. Obtener la ruta absoluta de un archivo dentro de un JAR dentro de un EAR?
- 20. ¿Obtiene un objeto de archivo o URI para un archivo dentro de un archivo con Java?
- 21. Compilación cruzada de un módulo kernel
- 22. descriptor de socket vs descriptor de archivo
- 23. ¿Cómo obtener el nombre de un archivo abierto?
- 24. ColdFusion: obtener el nombre de un archivo antes de subir
- 25. Modificar un archivo dentro de un jar
- 26. Acceso a un archivo dentro de un archivo .jar
- 27. ¿Cómo puedo cambiar el nombre de un archivo en ASP.NET?
- 28. Cómo construir un archivo de manifiesto para un módulo Perl
- 29. ¿Cómo puedo resolver un nombre de archivo canónico en Windows?
- 30. ¿Cómo verificar si un descriptor de archivo tiene datos disponibles?
posible duplicado de [sys_readlink falla EFAULT - alternativa] (http://stackoverflow.com/questions/8216871/sys-readlink-fails-efault-alternative) – ephemient