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.