mmapをC言語で使って、正しく動作するかどうかを確認しようとしています。現在、mmapを使用してバイナリファイルをバイト単位で読み込もうとしています。私のコードは次のようなものです:SegfaultはCでmmapを使ってバイナリファイルを読み込みます
#include <unistd.h>
#include <sys/types.h>
#include <sys/mman.h>
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
int main(int argc, char *argv[]) {
int fd;
char *data;
for (int i = 1; i<argc; i++)
{
if(strcmp(argv[i],"-i")==0)
fd = open(argv[i+1],O_RDONLY);
}
data = mmap(NULL, 4000, PROT_READ, MAP_SHARED, fd, 8000);
int i = 0;
notation = data [i];
// ......
}
私はnotation = data [0]を試して、segfaultを取得すると問題が発生します。私は、バイナリファイルの最初のバイトも文字であることを確信しています。私のforループはコンパイル時に-iフラグがあるかどうかをチェックし、次の引数がある場合はファイル名にします。
ファイルのサイズは8000バイト以上ですか?また、マニュアルページには、 "オフセットはsysconf(_SC_PAGE_SIZE)によって返されるページサイズの倍数でなければなりません"と記載されています。もしユーザが-iパラメータを指定せず、forループがargc-1までループする必要がある場合には、fdを-1に初期化する必要があります。それ以外の場合は、ユーザが指定した場合を超えてargvにアクセスします。私は最後のパラメータとして。 – EricS