我一直在努力解决这个问题,我无法理解它!
我创建了一个mmap-write.c脚本,可以将整数文件正确映射到内存中。例如,当我跑:
./mmap-write /tmp/afile 10
然后我可以捕获文件并获得类似于以下内容的内容:
cat /tmp/afile
71 -94 -92 -18 58 63 -16 97 47 -55
换句话说,我的mmap-write脚本会创建10个随机整数并将它们映射到内存。现在,在我的mmap-read脚本中,我很难将内容读回控制台,并得到以下输出:
71 1 -94 -94 94 4 -92 -92 92 2
你可以看到它是如何按顺序读取整数,但是打印第一个int,并重新打印它,消除第一个字符,直到它结束。然后它开始对文件中的下一个整数做同样的事情。
无论如何,这是我的代码:
#include <stdlib.h>
#include <stdio.h>
#include <fcntl.h>
#include <sys/mman.h>
#include <sys/stat.h>
#include <unistd.h>
#include <string.h>
#include <stdbool.h>
#include <ctype.h>
#include "mmap.h"
int main (int argc, char* const argv[]) {
int fd, i, integer, numInts;
char* file_memory;
numInts = atoi(argv[2]);
fd = open (argv[1], O_RDWR, S_IRUSR | S_IWUSR);
memset(file_memory, '\0', FILESIZE);
file_memory = (char*) mmap (NULL, FILESIZE, PROT_READ | PROT_WRITE,
MAP_SHARED, fd, 0);
close (fd);
for (i = 0; i < numInts; i++) {
sscanf((char*) &file_memory[i], "%d ", &integer);
printf ("%d ", integer);
}
munmap (file_memory, FILESIZE);
return 0;
}
请注意:我确实在我的实际代码中进行了错误检查,但为了简洁和清晰,我将其遗漏了,因为我不相信这是真正的罪魁祸首。我非常有信心这是令人讨厌的片段:
for (i = 0; i < numInts; i++) {
sscanf((char*) &file_memory[i], "%d ", &integer);
printf ("%d ", integer);
}
非常感谢任何帮助!