以下は、hugepagesを使用してubuntuでファイルをmmapingするためのコードですが、この呼び出しは "invalid argument"というエラーで失敗しています。しかし、mmapのファイル記述子パラメータなしで MAP_ANONフラグを渡すと、動作します。私はこの背後にある理由を理解できません。Ubuntu 10.04、MAP_SHAREDでMAP_HUGETLBを使用したときにエラーが発生しました
第2に、このフラグ自体が変更がファイルに書き戻されないことを意味する場合、MAP_PRIVATEでファイルのmmapingが許可される理由を理解できません。これはいつもMAP_ANONを使って達成することができますか?それとも何か不足していますか?
誰かが私を助けることができますか?
int32_t main(int32_t argc, char** argv) {
int32_t map_length = 16*1024*1024; // 16 MB , huge page size is 2 MB
int32_t protection = PROT_READ | PROT_WRITE;
int32_t flags = MAP_SHARED | MAP_HUGETLB;
int32_t file__ = open("test",O_RDWR|O_CREAT | O_LARGEFILE,s_IRWXU | S_IRGRP | S_IROTH);
if(file__ < 0) {
std::cerr << "Unable to open file\n";
return -1;
}
if (ftruncate(file__, map_length) < 0) {
std::cerr
<< "main :: unable to truncate the file\n"
<< "main :: " << strerror(errno) << "\n"
<< "main :: error number is " << errno << "\n";
return -1;
}
void *addr= mmap(NULL, map_length, protection, flags, file__, 0);
if (addr == MAP_FAILED) {
perror("mmap");
return -1;
}
const char* msg = "Hello World\n";
int32_t len = strlen(msg);
memcpy(addr,msg,len);
munmap(addr, map_length);
close(file__);
return 0;
}
'int32_t main'はエラーです。 C++標準では、 'main'の戻り値の型と' argc'の型はどちらも 'int'でなければなりません。 –
larsmans、それはプログラムの出力に影響しますか?私のアーキテクチャでは、intはint32_tと同じですので、まったく問題ではありません。しかし、標準的な観点からは、それは正しくない、私は同意する。 (以前、私はこのコメントを書いて何らかの誤りを犯しました) – Faraz
Faraz:いいえ、彼はちょうどニックピッキングしていました。 – BjoernD