Vous devez être conscient que vous devez éviter d'e/S de fichier lorsque cela est possible. L'idée principale est de "monter d'un niveau plus profond" et appelez VFS fonctions de niveau au lieu de le syscall gestionnaire directement:
Comprend:
#include <linux/fs.h>
#include <asm/segment.h>
#include <asm/uaccess.h>
#include <linux/buffer_head.h>
L'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;
}
La fermeture d'un fichier (similaire):
void file_close(struct file* file) {
filp_close(file, NULL);
}
La lecture des données à partir d'un fichier (similaire à 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;
}
L'écriture de 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 des modifications d'un fichier (similaire à fsync):
int file_sync(struct file* file) {
vfs_fsync(file, 0);
return 0;
}
[Modifier] à l'Origine, j'ai proposé à l'aide de file_fsync, qui est allé dans les nouvelles versions du noyau. Merci pour le pauvre gars qui suggère le changement, mais dont le changement a été rejetée. Le montage a été rejetée avant que je puisse l'examiner.