私の問題は、ファイルの読み込みを処理し、ファイルのエクステントがどこかのロジックを実行する場所であることを理解することです。ioctlをFS_IOC_FIEMAPで使用する方法
これらの問題を解決するための直接的なAPI呼び出しがないので、私はこれを行うためにioctl apiを使用することに決めました。私は、cpコマンドがコードを辿って疎なファイルをコピーする問題をどのように取り扱っているのかを知り、これを見終わった。
だから、私は、ユーザー空間で実行されている私のサンプルプログラムで同じことを実行しようとしましたし、「引数が無効です」とのことでエラーアウト。私は何が紛失しているのか、これがユーザー空間からも可能なのかどうかはわかりません。私はext4ファイルシステム上でubuntu 14.04を実行しています。これはデバイスドライバがこれらの要求モードをサポートしていることで問題になるでしょうか?
#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;
}
作業中の映画マップを初期化する!どうもありがとうございました! – Aila