ファイルをStringにmmapします。msyncの 'length`パラメータが機能しません
int fd = open(FILE_PATH, O_RDWR);
struct stat s;
int status = fstat(fd, &s);
char *f = (char*) mmap (0, s.st_size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
、私はf
を解析し、いくつかの変更を行いますcJSON。
cJSON *root = cJSON_Parse(f);
//some JSON operation
終了後、cJSONから文字列を再生成し、ディスクに書き戻そうとしました。
char* rendered = cJSON_Print(root);
memcpy(f, rendered, strlen(rendered));
msync(f, strlen(renderer), MS_SYNC);
mmapまたはmsyncにエラーはありません。
ファイルの内容を確認したところ、cJSONライブラリを使用して変更したものが正しく変更されていました。
ただし、ファイルが完成していません。具体的には、ディスクに書き戻したサイズ(Sublimeを使用してチェックします)は、length
パラメータに入れたものではありません。つまり、msync
です。 strlen(rendered)
ですが、ファイルの元のサイズはstrlen(f)
です。
次に、length
を512
128
などのハードコードで割り当てようとしましたが、すべてが機能しないことがわかりました。 mmapからファイルに書き戻されるサイズは、依然としてmmaped charの元のサイズです。
しかしmsync
のマニュアルでは、それは言う:
addrから始まる長さlengthが更新されたメモリ領域に対応するファイルの一部。
だから私は困惑し、どのように私がディスクにフラッシュしたいアドレスの長さを割り当てることができるか教えてくれますか?
'msync'は基本となるマッピングのサイズを変更できません。元のファイルサイズを 'mmap'しただけで、マップされたアドレスからサイズを変更することはできません。 – kaylum
ディスクへのリード/ライトはブロック単位で行われ、mmap()はリード/ライト時に構築されます。歴史的にブロックサイズは512バイトですが、今日では4096バイトです。部分ブロックを書くことはできません。 (ファイルを切り捨てることができます。その場合、最後のブロックの一部だけが*表示されます*) – joop
"メモリ領域に対応するファイルの部分"を引用するmsyncのmanページの "updated"長さの更新を参照していません。 – kaylum