gpt4 book ai didi

c - 使用 mmap 映射共享内存大小超过 ftruncate 完成的设置大小

转载 作者:太空宇宙 更新时间:2023-11-04 03:12:40 24 4
gpt4 key购买 nike

我有几个问题基于以下来源:

#include <unistd.h>
#include <fcntl.h>
#include <sys/mman.h>
#include <stdio.h>

int g;
int main(void) {
int fd = shm_open("/myregion", O_CREAT | O_RDWR, S_IRUSR | S_IWUSR);
ftruncate(fd, sizeof(int)); // set size by sizeof(int)
int *p1 = mmap(NULL, 10*sizeof(int), PROT_READ | PROT_WRITE, MAP_SHARED, fd,0); //now map 10*sizeof(int).
if (p1== MAP_FAILED) {
printf("*****************error");
}
*p1 = mmap(NULL, 8*sizeof(int), PROT_READ | PROT_WRITE, MAP_SHARED, fd,0);
if (p1== MAP_FAILED) {
printf("*****************error");
}

*p1=89;

return g;
}

问题 1:为什么我在将大小设置为 size_of(int) 然后映射 10*size_of(int) 时没有看到任何错误

问题二:这里创建了多少个共享内存实例?我的意思是,是否像我创建了两次 mmap 一样只创建了一个或两个共享内存?

谢谢

最佳答案

给定代码

#include <unistd.h>
#include <fcntl.h>
#include <sys/mman.h>
#include <stdio.h>

int g;
int main(void) {
int fd = shm_open("/myregion", O_CREAT | O_RDWR, S_IRUSR | S_IWUSR);
ftruncate(fd, sizeof(int)); // set size by sizeof(int)
int *p1 = mmap(NULL, 10*sizeof(int), PROT_READ | PROT_WRITE, MAP_SHARED, fd,0); //now map 10*sizeof(int).
*p1 = mmap(NULL, 8*sizeof(int), PROT_READ | PROT_WRITE, MAP_SHARED, fd,0);
if (!p1){
printf("*****************error");
}
*p1 = g;
*p1=89;

return g;
}

Question 1 : why i don't see any error while i set size as size_of(int) and then map 10*size_of(int)

因为您不检查 mmap() 的返回值,所以您不知道是否发生了错误。通过立即再次调用 mmap()

*p1 = mmap(NULL, 8*sizeof(int), PROT_READ | PROT_WRITE, MAP_SHARED, fd,0);

您屏蔽了第一个 mmap() 调用中的任何潜在错误,并且您还泄漏了任何已成功分配的内存。

Question 2: how many instace of shared mem is created here? i mean is there only one shared mem created or two as i did mmap twice?

如果第一次调用成功,则映射了两个内存段。如果失败,如果第二个成功,则您只映射一个。

如果第一次调用确实成功,则说明内存泄漏。

请注意,如果您尝试向 mmap() 段写入超过您使用 ftruncate() 设置的文件大小的末尾,您将不会导致文件增长。每the POSIX mmap() documentation :

Note that references beyond the end of the object do not extend the object as the new end cannot be determined precisely by most virtual memory hardware. Instead, the size can be directly manipulated by ftruncate().

在 Linux 上,尝试访问映射文件末尾之外的 mmap() 数据可能会导致您的进程 receiving a SIGBUS signal .

关于c - 使用 mmap 映射共享内存大小超过 ftruncate 完成的设置大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54942011/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com