가능하면 Linux 커널 내에서 파일 I / O를 피해야합니다. 주요 아이디어는 "한 단계 더 깊게"가서 syscall 핸들러 대신 VFS 레벨 함수 를 직접 호출하는 것입니다.
다음을 포함합니다 :
#include <linux/fs.h>
#include <asm/segment.h>
#include <asm/uaccess.h>
#include <linux/buffer_head.h>
파일 열기 (열기와 유사) :
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 사용을 제안했습니다. 변경을 제안했지만 변경이 거부 된 가난한 사람 덕분입니다. 검토하기 전에 편집이 거부되었습니다.