除了共享内存的大小之外,还有什么阻止我读/写呢?(系统V IPC)

除了共享内存的大小之外,还有什么阻止我读/写呢?(系统V IPC),c,shared-memory,sysv-ipc,C,Shared Memory,Sysv Ipc,我正在做的是: shmget(shm_键,shm_大小,0666 | IPC|u创建)(当然还要附加到它) 我已经将大小设置为正好12个字节,但当我尝试以下操作时: sprintf(shm_ptr,“想象一下这里大约有200-300个字符”) 它似乎在没有问题或警告的情况下正常工作,为了检查这一点,我尝试从一个完全不同的进程(第一个进程是我fork和exec)中读取它,并且非常确定 printf(“%s”,shm_ptr) 打印该段中的消息,该段应为12字节。SystemV IPC应该是这样的吗

我正在做的是:

shmget(shm_键,shm_大小,0666 | IPC|u创建)(当然还要附加到它)

我已经将大小设置为正好12个字节,但当我尝试以下操作时:

sprintf(shm_ptr,“想象一下这里大约有200-300个字符”)

它似乎在没有问题或警告的情况下正常工作,为了检查这一点,我尝试从一个完全不同的进程(第一个进程是我fork和exec)中读取它,并且非常确定

printf(“%s”,shm_ptr)

打印该段中的消息,该段应为12字节。SystemV IPC应该是这样的吗?对于这个问题没有解决办法?如果是这样的话,为什么首先要设定尺寸

感谢您的时间和提前回答。

硬件正在修复页面大小,因此您的虚拟地址空间以4KB的页面组织

任何虚拟地址段(甚至来自SysV IPCMEM的虚拟地址段)都是该页面大小的倍数。与
PAGESIZE
一起使用或获取它

(Linux也有“巨大的页面”,例如x86上的1M字节)

BTW,阅读并考虑使用<代码> /PRO/MUL/MAP> <代码>或<代码> /PRO/1234 /MAPs<代码> 1234来查询该过程…< /P> PS.更喜欢使用。

硬件正在固定页面大小,因此您的虚拟地址空间以4KB的页面组织

任何虚拟地址段(甚至来自SysV IPCMEM的虚拟地址段)都是该页面大小的倍数。与
PAGESIZE
一起使用或获取它

(Linux也有“巨大的页面”,例如x86上的1M字节)

BTW,阅读并考虑使用<代码> /PRO/MUL/MAP> <代码>或<代码> /PRO/1234 /MAPs<代码> 1234来查询该过程…< /P>


注:更喜欢使用。

没有什么可以阻止您,但是规范不保证这种情况下的任何特定行为

实际上,内存区域的实际大小将四舍五入到特定于系统的页面大小。这使得访问比请求的内存更多的内存成为可能,但可能会有后果。例如,内存清理程序可能会将此视为错误

这适用于所有内存映射,包括使用
mmap
创建的内存映射

现在,为什么需要访问请求区域以外的内存?如果您需要更多内存,只需请求更多。让内存清理器不会因为意外行为而变得疯狂是一件非常有用的事情。除此之外,我不认为这有任何后果,至少我不能想出任何东西

编辑:
如果想在代码中查找访问错误,可以在内存块的末尾放置一个“保护页”。只需再分配一页内存,并使用
mprotect
将其访问权限更改为
PROT\u NONE
。这样,如果超出映射范围(但不超过1页),您将获得SEGFULT。

没有什么可以阻止您,但是规范不保证这种情况下的任何特定行为

实际上,内存区域的实际大小将四舍五入到特定于系统的页面大小。这使得访问比请求的内存更多的内存成为可能,但可能会有后果。例如,内存清理程序可能会将此视为错误

这适用于所有内存映射,包括使用
mmap
创建的内存映射

现在,为什么需要访问请求区域以外的内存?如果您需要更多内存,只需请求更多。让内存清理器不会因为意外行为而变得疯狂是一件非常有用的事情。除此之外,我不认为这有任何后果,至少我不能想出任何东西

编辑:
如果想在代码中查找访问错误,可以在内存块的末尾放置一个“保护页”。只需再分配一页内存,并使用
mprotect
将其访问权限更改为
PROT\u NONE
。这样,如果超出映射范围(但不超过1页),您将获得SEGFULT。

没有任何东西可以阻止您尝试使用区域外的地址。但也没有什么能保护你免受可能的后果

它可能只是表现得好像这个区域更大。它可能是segfault(或者您平台上的任何等价物)。它可能会覆盖随机堆内存,导致您的程序以不可预知的方式出现错误。它可以做任何事


C没有提供一个监护人来保证你遵守规则。监护人很昂贵,如果您想要监护人,您必须自己付费(通过编写保护代码,并在必要时执行保护代码)。

没有任何东西可以阻止您尝试使用区域外的地址。但也没有什么能保护你免受可能的后果

它可能只是表现得好像这个区域更大。它可能是segfault(或者您平台上的任何等价物)。它可能会覆盖随机堆内存,导致您的程序以不可预知的方式出现错误。它可以做任何事


C没有提供一个监护人来保证你遵守规则。监护人很昂贵,如果你想要一个,你必须自己付费(通过编写保护代码,并在必要时执行)。

哦,我明白了,所以设置大小的合适方法是页面大小的倍数?哦,我明白了,所以设置大小的合适方法是页面大小的倍数?嗯,老实说,我试图得到一个segfault或其他东西,就像试图访问指针的一个越界区域一样。如果发生这种情况,我就会知道当我的代码出错时,有可能会出现segfault,这会缩小我可能出错的代码行。但从我从其他答案中看到的情况来看,这是因为大小被四舍五入到页面大小的最近倍数,这就是为什么我没有收到错误/警告等