我將一個文件轉換爲String。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);
然後我cJSON解析f
並做一些修改。
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進行檢查)不是我在msync
的參數length
中輸入的大小, strlen(rendered)
,但文件的原始大小,即strlen(f)
。
然後我試圖通過512
128
硬編碼地分配length
或其他,但我發現它們都不起作用。從mmap回寫到文件的大小仍然是mmaped字符的原始大小。
但msync
手冊中,它說:
對應於存儲區開始於addr和具有長度的長度被更新的文件的一部分。
所以我感到困惑,誰能告訴我如何分配地址的長度我想刷新到磁盤?
'msync'不能更改底層映射的大小。您只有'mmap'原始文件大小,並且不能通過映射的地址更改大小。 – kaylum
對磁盤的讀/寫操作是以塊爲單位執行的,而mmap()是在讀/寫的基礎上構建的。歷史上的塊大小是512字節,今天它通常是4096字節。你不能寫一個分塊。 (您可以截斷文件,在這種情況下,只有最後一個塊的一部分將*可見*) – joop
您引用的msync手冊頁中的「更新」是指「與存儲區域對應的文件部分」並不涉及更新長度。 – kaylum