如何在Linux系统上使用mmap()进行读写

如何在Linux系统上使用mmap()进行读写,linux,mmap,segment,Linux,Mmap,Segment,我需要在Linux中使用mmap()创建一些流输入和流输出类。为此,我尝试编写一些测试代码,将一些整数写入一个文件,保存它,再次加载它,然后将文件中的数据写入cout。如果该测试代码有效,那么在之后进行流输入和流输出就不会有问题 当我刚开始的时候,我得到了段错误,如果我没有得到,什么也没发生,所以我用谷歌搜索了一下。我在这本书的第107页找到了一些有用的代码。我复制粘贴了该代码并做了一些小更改,得到了以下代码: int fd; void* file_memory; /* Prepare a f

我需要在Linux中使用mmap()创建一些流输入和流输出类。为此,我尝试编写一些测试代码,将一些整数写入一个文件,保存它,再次加载它,然后将文件中的数据写入cout。如果该测试代码有效,那么在之后进行流输入和流输出就不会有问题

当我刚开始的时候,我得到了段错误,如果我没有得到,什么也没发生,所以我用谷歌搜索了一下。我在这本书的第107页找到了一些有用的代码。我复制粘贴了该代码并做了一些小更改,得到了以下代码:

int fd;
void* file_memory;

/* Prepare a file large enough to hold an unsigned integer.  */
fd = open ("mapTester", O_RDWR | O_CREAT, S_IRUSR | S_IWUSR);

//Make the file big enough
lseek (fd, 4 * 10 + 1, SEEK_SET);
write (fd, "", 1);
lseek (fd, 0, SEEK_SET);

/* Create the memory mapping.  */
file_memory = mmap (0, 4 * 10, PROT_WRITE, MAP_SHARED, fd, 0);
close (fd);

/* Write a random integer to memory-mapped area.  */
sprintf((char*) file_memory, "%d\n", 22);

/* Release the memory (unnecessary because the program exits).  */
munmap (file_memory, 4 * 10);

cout << "Mark" << endl;

//Start the part where I read from the file

int integer;

/* Open the file.  */
fd = open (argv[1], O_RDWR, S_IRUSR | S_IWUSR);

/* Create the memory mapping.  */
file_memory = mmap (0, 4 * 10, PROT_READ | PROT_WRITE,
MAP_SHARED, fd, 0);
close (fd);

/* Read the integer, print it out, and double it.  */
scanf ((char *) file_memory, "%d", &integer);
printf ("value: %d\n", integer);
sprintf ((char*) file_memory, "%d\n", 2 * integer);

/* Release the memory (unnecessary because the program exits).  */
munmap (file_memory, 4 * 10);
intfd;
无效*文件存储;
/*准备一个足以容纳无符号整数的文件*/
fd=开放(“地图测试器”,O|RDWR | O|CREAT,S|IRUSR | S|IWUSR);
//使文件足够大
lseek(fd,4*10+1,寻道集);
写(fd,“,1);
lseek(fd,0,SEEK_集);
/*创建内存映射*/
文件内存=mmap(0,4*10,保护写入,映射共享,fd,0);
关闭(fd);
/*将随机整数写入内存映射区域*/
sprintf((char*)文件\u内存,“%d\n”,22);
/*释放内存(由于程序退出而不需要)*/
munmap(文件存储,4*10);

cout你应该测试一下测试结果。如果它给出
MAP\u失败
请检查并找出原因

您最好将mmap映射为多个页面,每个页面通常为4K字节,由

您可以使用查找某个给定文件的大小(以及许多其他数字)

您可以在现有的Linux程序上使用
strace
,了解它们在做什么系统调用


另请参见关于
/proc/
等的内容。

您的
scanf()
调用应该是
sscanf()
,第二个open应该使用
“mapTester”
而不是
argv[1]
作为文件名。当我修复这些错误时,您发布的程序工作正常(打印出
22
并将
44
保留在文件中)。

我无法使代码与您所说的更改一起工作。我不知道如何格式化注释中的代码,所以我只是把它放在消息的末尾。我使用了g++编译器命令,也许你正在使用另一个?好的,我不能添加更多的代码,因为它太长了。我复制了我在这里写的代码,更改了2个位置,代码的最后一部分出现了分段错误。谢谢你的帮助,我发现我写的文件有写保护,因此一切都失败了。
fd = open("mapTester", O_RDONLY);

int* buffer = (int*) malloc (4*10);

read(fd, buffer, 4 * 10);

for(int i = 0; i < 1; i++)
{
    cout << buffer[i] << endl;
}