Файлы чтения-записи в модуле ядра Linux

accounting.js - это крошечная библиотека JavaScript для форматирования чисел, денег и валюты.

89
задан red0ct 6 November 2018 в 12:52
поделиться

1 ответ

Вы должны знать, что вам следует избегать файлового ввода-вывода, когда это возможно. Основная идея состоит в том, чтобы пойти «на один уровень глубже» и напрямую вызвать функции уровня 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;
}

Закрыть файл (аналогично close):

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;
}

[Edit] Originally, I proposed using file_fsync, which is gone in newer kernel versions. Thanks to the poor guy suggesting the change, but whose change was rejected. The edit was rejected before I could review it.

114
ответ дан 24 November 2019 в 07:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: