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?
risposta
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
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
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.
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
@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. –
Esattamente, è quello che ho scoperto osservando più da vicino che cosa "struct file *" stava rappresentando. – Asblarf
- 1. Chiamata di funzione nel kernel linux
- 2. Quali sono gli argomenti "struct file_operations"?
- 3. Quale contesto viene chiamata una funzione in Linux Kernel
- 4. Sostituzione della funzione close() in Linux con la mia funzione close()
- 5. intesa macro container_of nel kernel di Linux
- 6. ottenere puntatore per la classe di dispositivi (classe struct) esistenti nel modulo del kernel Linux
- 7. su typecheck nel kernel linux
- 8. Perché la funzione dichiarata nel prototipo non è stata chiamata?
- 9. quella che è la "corrente" in linux sorgenti del kernel
- 10. Cronometraggio nel kernel Linux 2.6
- 11. Perché la funzione curry è chiamata curry?
- 12. In che modo Linux sa quale ioctl deve chiamare?
- 13. Comunicazione tra moduli nel kernel Linux
- 14. stdlib.h alternativa nel kernel di Linux?
- 15. struct file in linux driver
- 16. Che cosa significa "EXPORT_SYMBOL" nel codice del kernel di Linux?
- 17. Initramfs integrato nel kernel Linux personalizzato non è in esecuzione
- 18. Qual è lo scopo dell'opcode UD2 nel kernel di Linux?
- 19. Come utilizzare la memoria contigua nel kernel di Linux?
- 20. Perché il mio modulo non è in grado di gestire la richiesta di paging del kernel?
- 21. kernel Linux: aggiungi la chiamata di sistema in modo dinamico tramite il modulo
- 22. Ottenere inode dal percorso in Linux Kernel
- 23. nel kernel linux, asm o asm-generic?
- 24. La dichiarazione di funzione non è un prototipo in C
- 25. Aggiunta di una nuova chiamata di sistema nel kernel Linux 3.3
- 26. significato di THIS_MODULE nel driver per Linux
- 27. timestamp leggibile dall'uomo nel kernel linux
- 28. come utilizzare CryptoAPI nel kernel Linux 2.6
- 29. Qual è la differenza b/n __raw_readl/__ raw_writel e readl/writel nel kernel di Linux?
- 30. Perché la funzione textFieldShouldReturn non viene chiamata?
Quindi stai chiedendo perché si chiama 'release' e non' close'? – cnicutar
Sì, ho corretto il titolo. –