我正在使用MapViewOfFile在內存中保存文件的一部分。有一個流指向這個文件並寫入它,然後倒帶。我使用指向映射文件開始處的指針,並讀取,直到找到作爲最終字符寫入的空字符。
int fd;
yyout = tmpfile();
fd = fileno(yyout);
#ifdef WIN32
HANDLE fm;
HANDLE h = (HANDLE) _get_osfhandle (fd);
fm = CreateFileMapping(
h,
NULL,
PAGE_READWRITE|SEC_RESERVE,
0,
4096,
NULL);
if (fm == NULL) {
fprintf (stderr, "%s: Couldn't access memory space! %s\n", argv[0], strerror (GetLastError()));
exit(GetLastError());
}
bp = (char*)MapViewOfFile(
fm,
FILE_MAP_ALL_ACCESS,
0,
0,
0);
if (bp == NULL) {
fprintf (stderr, "%s: Couldn't fill memory space! %s\n", argv[0], strerror (GetLastError()));
exit(GetLastError());
}
的數據被髮送到yyout
流,直到flushData()
被調用。這會向流寫入一個空值,然後刷新,然後倒回流。然後,我從映射內存的開始處開始讀取字符,直到達到空值。
void flushData(void) {
/* write out data in the stream and reset */
fprintf(yyout, "%c%c%c", 13, 10, '\0');
fflush(yyout);
rewind(yyout);
if (faqLine == 1) {
faqLine = 0; /* don't print faq's to the data file */
}
else {
char * ps = bp;
while (*ps != '\0') {
fprintf(outstream, "%c%c", *ps, blank);
ps++;
}
fflush(outfile);
}
fflush(yyout);
rewind(yyout);
}
刷新後,更多的數據寫入到流中,應該將其設置爲存儲區的開始位置。就像我可以用gdb確定的那樣,流不會被倒回,並最終填滿分配的空間。
由於流指向底層文件,所以最初不會引起問題。但是,當我試圖走內存時,我從來沒有找到null。這導致了SIGSEV
。如果你想知道爲什麼我需要這個的更多細節,see here。
爲什麼我不按預期重用內存空間?
你想達到什麼目的?爲什麼代碼不能取消映射視圖並關閉句柄? – 0xC0000022L 2012-04-26 18:50:54
@STATUS_ACCESS_DENIED這只是代碼庫的一個片段,在我完成使用映射空間後,我將其取消映射並關閉句柄。重點是將文件流重定向到Windows系統的內存中。 – 2012-04-26 19:02:36