Linuxカーネル内からのファイルI / Oは可能な限り回避する必要があることに注意してください。主な考え方は、「1レベル深く」、syscallハンドラーの代わりにVFSレベルの関数を直接呼び出すことです。
含まれるもの:
#include <linux/fs.h>
#include <asm/segment.h>
#include <asm/uaccess.h>
#include <linux/buffer_head.h>
ファイルを開く(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;
}
ファイルを閉じる(閉じると同様):
void file_close(struct file *file)
{
filp_close(file, NULL);
}
ファイルからデータを読み取る(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;
}
ファイルへのデータの書き込み(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;
}
同期はファイルを変更します(fsyncと同様):
int file_sync(struct file *file)
{
vfs_fsync(file, 0);
return 0;
}
[編集]当初、私はfile_fsyncを使用することを提案しましたが、これは新しいカーネルバージョンではなくなりました。変更を提案した貧しい男のおかげで、その変更は拒否されました。確認する前に編集が拒否されました。