使用mmap映射共享内存大小超过ftruncate完成的设置大小
基于以下来源,我有几个问题:使用mmap映射共享内存大小超过ftruncate完成的设置大小,c,ubuntu,posix,shared-memory,C,Ubuntu,Posix,Shared Memory,基于以下来源,我有几个问题: #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)); /
#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;
}
#包括
#包括
#包括
#包括
int g;
内部主(空){
int fd=shm|u open(“/myregion”,O|u RDWR,S|u IRUSR|S|u IWUSR);
ftruncate(fd,sizeof(int));//按sizeof(int)设置大小
int*p1=mmap(NULL,10*sizeof(int),PROT_READ | PROT_WRITE,MAP_SHARED,fd,0);//现在映射10*sizeof(int)。
如果(p1==映射_失败){
printf(“错误”);
}
*p1=mmap(空,8*sizeof(int),PROT_READ | PROT_WRITE,MAP_SHARED,fd,0);
如果(p1==映射_失败){
printf(“错误”);
}
*p1=89;
返回g;
}
问题1:
为什么我在将大小设置为size_of(int)然后映射为10*size_of(int)时没有看到任何错误
问题2:
这里创建了多少个Instance的共享内存?我的意思是,是否只有一个或两个共享mem被创建,就像我两次创建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;
}
您屏蔽了第一次mmap()
调用中的任何潜在错误,并且泄漏了成功分配的所有内存
问题2:这里创建了多少个Instance的共享内存?我的意思是,是否只有一个或两个共享mem被创建,就像我两次创建mmap一样
如果第一次调用成功,则映射了两个内存段。如果失败,则仅当第二次成功时才映射一个
如果第一次呼叫成功,则内存泄漏
请注意,如果试图写入的mmap()
'd段超过了使用ftruncate()
设置的文件大小的末尾,则不会导致文件增长。Per:
请注意,超出对象末尾的引用不会扩展对象,因为大多数虚拟内存硬件无法精确确定新的端点。相反,大小可以由ftruncate()直接操纵
在Linux上,尝试访问映射文件末尾以外的
mmap()
'd数据可能会导致您的进程。您能确保第一个mmap返回有效地址吗?我想可能是我错了。mmap
返回(void*)-1
表示失败。因此,错误检查无法真正捕获故障。我想知道你运行代码时得到了什么。我已经更新了源代码。我现在已经检查了这两个错误。您的第二个错误检查无效。实际上,如果在第一个mmap之后使用if(p1==MAP_FAILED){printf(************************error”);},它不会显示任何错误。@EricIpsum如果您更改代码以检测失败,并且检查没有检测到失败,那么第一个mmap()
工作。但正如最初发布的,您并不知道第一个mmap()
调用是否有效,尽管它很可能有效。
*p1 = mmap(NULL, 8*sizeof(int), PROT_READ | PROT_WRITE, MAP_SHARED, fd,0);