Моя проблема состоит в том, чтобы иметь дело с разреженным чтением файлов и понимать, где экстенты файла должны выполнять некоторую логику вокруг него.Как использовать ioctl с FS_IOC_FIEMAP
Поскольку нет прямого вызова API, чтобы определить эти данные, я решил использовать ioctl api для этого. Я понял, как команда cp занимается проблемами копирования более разреженных файлов, просматривая их код и заканчивая тем, что видит это.
Итак, я попытался сделать то же самое в моей программе образца работает в пользовательском пространстве, и оно ошибка вне с «недопустимым аргументом». Я не уверен, что мне не хватает или это возможно даже из пользовательского пространства. Я запускаю ubuntu 14.04 в файловой системе ext4. Это может быть проблема с драйвером устройства, поддерживающим эти режимы запроса ниже?
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <sys/fcntl.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <sys/ioctl.h>
#include <linux/fs.h>
#include "fiemap.h" //This is from https://github.com/coreutils/coreutils/blob/df88fce71651afb2c3456967a142db0ae4bf9906/src/fiemap.h
int main(int argc, char* argv[]) {
int input_fd;
if(argc != 2){
printf ("Usage: ioctl file1");
return 1;
}
/* Create input file descriptor */
input_fd = open (argv [1], O_RDWR);
if (input_fd < 0) {
perror ("open");
return 2;
}
union { struct fiemap f; char c[4096]; } fiemap_buf;
struct fiemap *fiemap = &fiemap_buf.f;
int s = ioctl(input_fd, FS_IOC_FIEMAP, fiemap);
if (s == 0) {
printf("ioctl success\n");
} else {
printf("ioctl failure\n");
char * errmsg = strerror(errno);
printf("error: %d %s\n", errno, errmsg);
}
/* Close file descriptors */
close (input_fd);
return s;
}
Инициализация fiemap работала! Большое спасибо! – Aila