-EINVAL
何らかの理由で、なぜなのかはっきりしていません。ここで、ファイルを開いてmmap
を試みます。
if ((fd = open(argv[1], O_RDWR)) < 0)
{
fprintf(stderr, "Failed to open %s: %s\n", argv[1], strerror(errno));
return 1;
}
struct stat statbuf;
if (fstat(fd, &statbuf))
{
fprintf(stderr, "stat filed: %s\n", strerror(errno));
return 1;
}
char* fbase = mmap(NULL, statbuf.st_size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
if (fbase == MAP_FAILED)
{
fprintf(stderr, "mmap failed: %s\n", strerror(errno));
return 1;
}
編集:追加する必要があります、エラーはmmap
で発生しています。
MAP_SHARED
をMAP_PRIVATE
に変更すると、これを成功させることができます。
これが失敗したこの理由は微妙です。私のコードはVirtualBox VM内で実行されており、mmap
にしようとしていたファイルはホストマシンの共有ディレクトリにありました。 VirtualBox仮想ファイルシステムは、ハイパーバイザーの境界を越えてMAP_SHARED
オプションを指定したmmap
を実装していないようです。
私の質問と彼の回答の両方についてjxhの役立つコメントを読むと、彼がホストのファイルシステムファイルをホストメモリにmmap
しようとしたため、このコードがうまく機能していることがわかります。
MAP_SHARED
からMAP_PRIVATE
への切り替えもこれと一致しています。プライベートにマップされたメモリは他のプロセスから見えないため、仮想ファイルシステムドライバーはおそらくメモリのマッピングに異論はありません。
解決策は、マップしたいファイルをゲストのハードドライブに移動し、そこから操作を実行することでした。
あなたの_statbuf.st_size
_は_0
_です。 mmap()
lengthパラメータが_0
_の場合、失敗します。
EINVAL
エラーmmap()
には3つの理由がリストされています:
_void *mmap(void *addr, size_t length, int prot, int flags, int fd, off_t offset);
_...
addr
、length
、またはoffset
は好きではありません(たとえば、サイズが大きすぎるか、ページ境界に配置されていません)。- (Linux 2.6.12以降)
length
は0でした。flags
に_MAP_PRIVATE
_も_MAP_SHARED
_も含まれていないか、これらの値の両方が含まれています。