2012-07-09 14 views
9

Sto provando a creare un modulo kernel Linux, che supporta operazioni di apertura, chiusura, lettura e scrittura. Quindi voglio registrare queste funzioni tramite struct file_operations, tuttavia non riesco a trovare la voce 'close' nella struct. Penso che dovrei usare "release" invece di "close", ma mi chiedo perché il nome sia "release" e non "close"?Perché la funzione close è chiamata release in `struct file_operations` nel kernel di Linux?

+0

Quindi stai chiedendo perché si chiama 'release' e ​​non' close'? – cnicutar

+0

Sì, ho corretto il titolo. –

risposta

11

Poiché il file può essere aperto più volte, quando si chiude un descrittore, solo nell'ultima chiamata chiusa per l'ultimo riferimento al file viene richiamata la versione. Quindi c'è una differenza tra chiusura e rilascio.

rilascio: chiamato all'ultimo chiusura (2) di questo file, cioè quando file-> f_count raggiunge 0. Anche se definito come ritorno int, il valore di ritorno viene ignorato dal VFS (vedi fs/file_table. c: __ fput()). more

+2

Si noti inoltre che mmap aumenta il riferimento a un file così; open, mmap, close sequence non ha come risultato la chiamata immediata, ma quando viene chiamato munmap. – auselen

4

Ho avuto una confusione simile. Perreal è corretto in quel rilascio non è chiamato quando viene chiamato vicino. Ecco un estratto dal libro Linux Device Drivers 3rd edition:

int (*flush) (struct file *); 

L'operazione di filo viene richiamato quando un processo chiude la sua copia di un descrittore di file per un dispositivo; dovrebbe eseguire (e attendere) eventuali operazioni in sospeso sul dispositivo. Questo non deve essere confuso con l'operazione fsync richiesta dai programmi utente. Attualmente, flush viene utilizzato solo nel codice NFS (network file system). Se flush è NULL, semplicemente non viene invocato.

int (*release) (struct inode *, struct file *); 

Questa operazione viene richiamata quando la struttura del file viene rilasciata. Come aperto, può mancare la versione.

Si noti che la versione non viene richiamata ogni volta che un processo chiama chiuso. Ogni volta che una struttura di file viene condivisa (ad esempio, dopo una fork o una dup), la release non verrà richiamata fino a quando non verranno chiuse tutte le copie. Se è necessario svuotare i dati in sospeso quando viene chiusa una copia, è necessario implementare il metodo di svuotamento.

+1

Se un singolo processo ha due descrittori di file che si riferiscono allo stesso file, chiamando 'close()' su ogni descrittore di file invocherà 'release' due volte, però. – Asblarf

+1

@Asblarf Questo ha senso poiché un oggetto separato "struct file *" sarebbe mantenuto all'interno del kernel per ogni descrittore di file aperto da un processo. –

+0

Esattamente, è quello che ho scoperto osservando più da vicino che cosa "struct file *" stava rappresentando. – Asblarf

Problemi correlati