这个使用mmap的阅读代码有什么问题?

时间:2016-07-02 17:14:47

标签: c mmap

我正在尝试运行此代码,而我的结尾是 - 价值:1 值:0.000000

我的问题是为什么两种结果都不同?

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/mman.h>
#include <string.h>
#include <unistd.h>

int main ()
{
int fd;
struct stat mystat;
void *pmap;
int i,integer;
double *values;
int32_t *mapped_baseA;
int32_t fdA;


fd = open("test.txt",O_RDWR); // a text file containing- 1 2 3 4 5
if(fd==-1)
{
perror("open");
exit(1);
}

if(fstat(fd,&mystat)<0)
{
perror("fstat");
close(fd);
exit(1);
}

pmap =  mmap(0,mystat.st_size,PROT_READ | PROT_WRITE,MAP_SHARED,fd,0);
if(pmap==MAP_FAILED)
{
perror("mmap failed");
close(fd);
exit(1);
}

//strncpy(pmap,"That is my name",15);
sscanf (pmap, " %d", &integer);
printf("value: %d \n", integer);

//从字符串扫描后打印值。

values = (double *) mmap(0,mystat.st_size,PROT_READ | PROT_WRITE,MAP_SHARED,fd,0);

printf("value: %lf \n", values[1]);

//从指针打印值     munmap(pmap,mystat.st_size);

close(fd);
return 0;
}

1 个答案:

答案 0 :(得分:1)

仔细阅读(和几次次)mmap(2)。注意:

  

文件以页面大小的倍数映射。

ERRORS部分

  

EINVAL我们不喜欢地址,长度或偏移(例如,它们也是                 大页面,或在页面边界上没有对齐)。

还要考虑在您的可执行文件上使用strace(1)

当然,内存映射只是通过修改process将映射文件的视图(作为 bytes 的原始序列)放入virtual address space。它显然不会进行任何转换(您可以在该视图的某些部分上使用sscanf(3)strtol(3)来将数字的UTF8或ASCII字符串表示形式转换为其机器表示形式)