Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用mmap映射共享内存大小超过ftruncate完成的设置大小_C_Ubuntu_Posix_Shared Memory - Fatal编程技术网

使用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);