2012-07-09 12 views
9

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?

+0

¿Entonces estás preguntando por qué se llama 'release' y no' close'? – cnicutar

+0

Sí, he reparado el título. –

Respuesta

11

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

+2

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

4

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.

+1

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

+1

@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. –

+0

Exactamente, eso es lo que descubrí mirando más de cerca lo que 'struct file *' estaba representando. – Asblarf

Cuestiones relacionadas