Sie sollten sich bewusst sein, dass Sie Datei-E / A innerhalb des Linux-Kernels nach Möglichkeit vermeiden sollten. Die Hauptidee ist, "eine Ebene tiefer" zu gehen und Funktionen der VFS-Ebene anstelle des Syscall-Handlers direkt aufzurufen :
Beinhaltet:
#include <linux/fs.h>
#include <asm/segment.h>
#include <asm/uaccess.h>
#include <linux/buffer_head.h>
Öffnen einer Datei (ähnlich wie beim Öffnen):
struct file *file_open(const char *path, int flags, int rights)
{
struct file *filp = NULL;
mm_segment_t oldfs;
int err = 0;
oldfs = get_fs();
set_fs(get_ds());
filp = filp_open(path, flags, rights);
set_fs(oldfs);
if (IS_ERR(filp)) {
err = PTR_ERR(filp);
return NULL;
}
return filp;
}
Schließen Sie eine Datei (ähnlich wie beim Schließen):
void file_close(struct file *file)
{
filp_close(file, NULL);
}
Lesen von Daten aus einer Datei (ähnlich wie bei pread):
int file_read(struct file *file, unsigned long long offset, unsigned char *data, unsigned int size)
{
mm_segment_t oldfs;
int ret;
oldfs = get_fs();
set_fs(get_ds());
ret = vfs_read(file, data, size, &offset);
set_fs(oldfs);
return ret;
}
Schreiben von Daten in eine Datei (ähnlich wie bei pwrite):
int file_write(struct file *file, unsigned long long offset, unsigned char *data, unsigned int size)
{
mm_segment_t oldfs;
int ret;
oldfs = get_fs();
set_fs(get_ds());
ret = vfs_write(file, data, size, &offset);
set_fs(oldfs);
return ret;
}
Durch das Synchronisieren wird eine Datei geändert (ähnlich wie bei fsync):
int file_sync(struct file *file)
{
vfs_fsync(file, 0);
return 0;
}
[Bearbeiten] Ursprünglich schlug ich die Verwendung von file_fsync vor, die in neueren Kernelversionen nicht mehr vorhanden ist. Vielen Dank an den armen Kerl, der die Änderung vorgeschlagen hat, dessen Änderung jedoch abgelehnt wurde. Die Bearbeitung wurde abgelehnt, bevor ich sie überprüfen konnte.
Seit der Version 4.14 von Linux - Kernel,
vfs_read
undvfs_write
Funktionen werden nicht mehr exportieren für den Einsatz in Modulen. Stattdessen werden Funktionen bereitgestellt, die ausschließlich für den Dateizugriff des Kernels vorgesehen sind:Außerdem wird
filp_open
keine User-Space-Zeichenfolge mehr akzeptiert, sodass sie direkt für den Kernelzugriff verwendet werden kann (ohne mit zu tanzenset_fs
).quelle