Estoy tratando de hacer un módulo de kernel de Linux, que admita operaciones de apertura, cierre, lectura y escritura. Así que quiero registrar estas funciones a través de struct file_operations, sin embargo, no puedo encontrar la entrada 'close' en la estructura. Creo que debería usar 'release' en lugar de 'close', pero me pregunto por qué el nombre es 'release' y no 'close'?¿Por qué la función close se llama release en `struct file_operations` en el kernel de Linux?
Respuesta
Como el archivo se puede abrir varias veces, cuando cierra un descriptor, solo en la última llamada cercana para la última referencia al archivo invoca la versión. Entonces hay una diferencia entre cerrar y liberar.
liberación: llamada en el último cierre (2) de este archivo, es decir, cuando Archivo-> f_count llega a 0. Aunque definido como un entero de retorno, el valor de retorno es ignorado por VFS (ver fs/file_table. c: __ fput()). more
Observemos también que mmap aumenta la referencia a un archivo; open, mmap, close sequence no da como resultado que la versión se llame inmediatamente sino que se llame a munmap. – auselen
Tuve una confusión similar. Perreal tiene razón en que la versión no se llama cuando se llama close. He aquí un extracto del libro Linux Device Drivers 3rd edition:
int (*flush) (struct file *);
La operación de vaciado se invoca cuando un proceso cierra su copia de un descriptor de archivo para un dispositivo; debería ejecutar (y esperar) cualquier operación pendiente en el dispositivo. Esto no se debe confundir con la operación fsync solicitada por los programas de usuario. Actualmente, el color solo se usa en el código del sistema de archivos de red (NFS). Si flush es NULL, simplemente no se invoca.
int (*release) (struct inode *, struct file *);
Esta operación se invoca cuando se libera la estructura de archivos. Como abierto, la versión puede faltar.
Tenga en cuenta que la liberación no se invoca cada vez que se cierra un proceso. Siempre que se comparte una estructura de archivos (por ejemplo, después de un tenedor o un duplicado), no se invocará la liberación hasta que se cierren todas las copias. Si necesita vaciar datos pendientes cuando se cierra cualquier copia, debe implementar el método de descarga.
Si un solo proceso tiene dos descriptores de archivo que hacen referencia al mismo archivo, al llamar 'close()' en cada descriptor de archivo se invocará 'release' dos veces. – Asblarf
@Asblarf Eso tiene sentido ya que un objeto "struct file *" separado se mantendría dentro del núcleo para cada descriptor de archivo abierto por un proceso. –
Exactamente, eso es lo que descubrí mirando más de cerca lo que 'struct file *' estaba representando. – Asblarf
- 1. Linux Kernel: copy_from_user - struct con punteros
- 2. Llamante de función en el kernel de Linux
- 3. ¿Cuándo se llama la función de sonda para un controlador de kernel de Linux?
- 4. sysinfo struct en linux/kernel.h
- 5. ¿Qué significa "EXPORT_SYMBOL" en el código de kernel de Linux?
- 6. ¿En qué contexto Kernel Thread se ejecuta en Linux?
- 7. Obteniendo el inodo de la ruta en Linux Kernel
- 8. ¿Por qué NDEBUG en lugar de RELEASE?
- 9. Makefile para el módulo kernel de Linux?
- 10. Kernel de Linux: ¿qué función tiene la fuente donde se eligen aleatoriamente los números de puerto?
- 11. ¿Por qué se firma el campo st_size en struct stat?
- 12. Qué función en glibc llama a la función principal
- 13. Linux kernel aio funcionalidad
- 14. desarrollo del kernel de Linux
- 15. ¿Por qué el archivo se llama catalina.out?
- 16. ¿Por qué se llama 'Cadena'?
- 17. ¿Por qué se llama RAII?
- 18. ¿Por qué se llama nillable?
- 19. No se puede escribir en la memoria kernel a través del módulo kernel de Linux (Ubuntu)
- 20. ¿Por qué se llama BSON?
- 21. ¿Cómo habilitar la depuración dinámica en el kernel de Linux?
- 22. ¿Cómo se define una función en un módulo de kernel de Linux y se usa en otro?
- 23. ¿Por qué se llama onBlur?
- 24. stdlib.h alternativa en kernel Linux?
- 25. La función no se llama
- 26. Cómo limpiar los cachés utilizados por el kernel de Linux
- 27. ¿Por qué __PRETTY_FUNCTION__ se llama __PRETTY_FUNCTION__?
- 28. ¿Por qué no se llama "onPause" en la siguiente situación?
- 29. ¿Por qué no se llama al destructor para el objeto devuelto de la función?
- 30. Uso de la comunicación ioctl entre el modo Kernel y el modo de usuario
¿Entonces estás preguntando por qué se llama 'release' y no' close'? – cnicutar
Sí, he reparado el título. –