慕森王
您应该意识到,在可能的情况下,您应该避免文件I/O。其主要思想是“更深一层”,并呼吁VFS级函数而不是直接使用SysCall处理程序:包括:#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;}关闭文件(类似于CLOSE):void file_close(struct file *file) {
filp_close(file, NULL);}从文件中读取数据(类似于扩展):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,它在较新的内核版本中消失了。感谢那个可怜的人提出的改变,但他的改变被拒绝了。编辑在我审阅之前就被拒绝了。