Mon problème est de traiter les lectures de fichiers éparses et de comprendre où les extensions du fichier doivent effectuer une certaine logique autour de lui. Comme il n'y a pas d'appel API direct pour comprendre ces choses, j'ai décidé d'utiliser ioctl api pour cela. J'ai eu l'idée de la façon dont la commande cp traite des problèmes de copie de fichiers clairsemés en passant par leur code et a fini par voir cela.Comment utiliser ioctl avec FS_IOC_FIEMAP
Alors, j'ai essayé de faire la même chose dans mon exemple de programme en cours d'exécution dans l'espace utilisateur et les erreurs dues à « Invalid argument ». Je ne suis pas sûr de ce qui me manque ou si c'est même possible de l'espace utilisateur. Je cours sur Ubuntu 14.04 sur un système de fichiers ext4. Cela pourrait-il être un problème avec le pilote de périphérique supportant ces modes de requête en dessous?
#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;
}
initialisation du fiemap travaillé! Merci beaucoup! – Aila