Dovresti essere consapevole che dovresti evitare l'I / O di file dal kernel Linux quando possibile. L'idea principale è di andare "un livello più in profondità" e chiamare le funzioni di livello VFS invece del gestore syscall direttamente:
Include:
#include <linux/fs.h>
#include <asm/segment.h>
#include <asm/uaccess.h>
#include <linux/buffer_head.h>
Apertura di un file (simile a open):
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;
}
Chiudere un file (simile alla chiusura):
void file_close(struct file *file)
{
filp_close(file, NULL);
}
Lettura dei dati da un file (simile a 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;
}
Scrittura di dati su un file (simile a 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 sincronizzazione modifica un file (simile a fsync):
int file_sync(struct file *file)
{
vfs_fsync(file, 0);
return 0;
}
[Modifica] Inizialmente, ho proposto di utilizzare file_fsync, che è andato nelle versioni più recenti del kernel. Grazie al poveretto che ha suggerito il cambiamento, ma il cui cambiamento è stato rifiutato. La modifica è stata rifiutata prima che potessi esaminarla.