Vous devez être conscient que vous devez éviter les E / S de fichiers depuis le noyau Linux lorsque cela est possible. L'idée principale est d'aller "d'un niveau plus profond" et d'appeler directement les fonctions de niveau VFS au lieu du gestionnaire d'appel système:
Comprend:
#include <linux/fs.h>
#include <asm/segment.h>
#include <asm/uaccess.h>
#include <linux/buffer_head.h>
Ouverture d'un fichier (similaire à ouvrir):
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;
}
Fermer un fichier (similaire à fermer):
void file_close(struct file *file)
{
filp_close(file, NULL);
}
Lecture des données d'un fichier (similaire à la lecture préalable):
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;
}
Ecrire des données dans un fichier (similaire à 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;
}
La synchronisation modifie un fichier (similaire à fsync):
int file_sync(struct file *file)
{
vfs_fsync(file, 0);
return 0;
}
[Modifier] À l'origine, j'ai proposé d'utiliser file_fsync, qui a disparu dans les nouvelles versions du noyau. Merci au pauvre type qui a suggéré le changement, mais dont le changement a été rejeté. La modification a été rejetée avant que je puisse l'examiner.