Вы должны знать, что вам следует избегать файлового ввода-вывода из ядра Linux, когда это возможно. Основная идея состоит в том, чтобы пойти «на один уровень глубже» и напрямую вызвать функции уровня 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] Первоначально я предлагал использовать file_fsync, которого нет в новых версиях ядра. Спасибо бедолаге, предложившему изменение, но чье изменение было отклонено. Редактирование было отклонено до того, как я смог его просмотреть.
Начиная с версии ядра Linux 4.14, функции
vfs_read
иvfs_write
функции больше не экспортируются для использования в модулях. Вместо этого предоставляются функции исключительно для доступа к файлам ядра:Кроме того,
filp_open
больше не принимает строку пользовательского пространства, поэтому ее можно использовать для прямого доступа к ядру (без танцев сset_fs
).источник