从mmap阅读时输出错误

时间:2017-02-19 17:48:45

标签: c mmap

我一直在努力解决这个问题,我无法理解它!

我创建了一个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);    
}

非常感谢任何帮助!

0 个答案:

没有答案