全て、
MapViewOfFileを使用して、ファイルの一部をメモリに保持しています。このファイルをポイントして書き込み、次に巻き戻されるストリームがあります。マップされたファイルの先頭へのポインターを使用し、最後の文字として書き込んだnull文字に到達するまで読み取ります。
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()
これにより、ストリームにnullが書き込まれ、フラッシュされてから、ストリームが巻き戻されます。次に、マップされたメモリの先頭から開始し、nullになるまでcharsを読み取ります。
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で判断できる限り、ストリームは巻き戻されず、最終的に割り当てられたスペースがいっぱいになります。
ストリームは基になるファイルを指しているため、これによって最初は問題が発生することはありません。しかし、私が記憶を歩こうとすると、私は決してヌルを見つけません。これはにつながりSIGSEV
ます。私がこれを必要とする理由の詳細が必要な場合は、こちらを参照してください。
なぜメモリスペースを期待どおりに再利用しないのですか?