C-是什么阻止我的阅读/写作,而不是共享内存的大小?(系统V IPC)



我正在做的是:

shmget(shm_key, shm_size, 0666 | IPC_CREAT);(当然附加到它)

我已经将大小设置为完全12个字节,但是当我尝试类似的事情时:

sprintf(shm_ptr, "Imagine about 200-300 characters heren");

它似乎正常工作于零问题或警告,并且要检查,我试图从完全不同的过程中读取它(i fork and exc ecip the第一个),并确保足够

printf("%s", shm_ptr);

打印该段中的消息,该消息应该为12个字节。System V IPC是否应该是这样的,并且没有解决该问题的解决方法?如果是这样,为什么首先设置尺寸?

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

没有任何阻止您,但是规格不能保证这种情况的任何特定行为。

实际上,内存区域的实际大小将围绕到系统特定的页面大小。这使得可以访问比要求更多的内存,但可能会产生后果。例如,内存消毒剂可能将其视为错误。

这对于所有内存映射都是如此,包括使用mmap创建的映射。

现在,为什么您需要访问所需区域之外的内存?如果您需要更多内存,只需请求更多。由于意外行为,让记忆消毒器不会发疯,这是一件非常有用的事情。除此之外,我认为这没有任何后果,至少我不能想出任何ATM。

编辑:如果您想在代码中找到访问错误,则可以在内存块的末尾放置一个"警卫页面"。只需分配内存的附加页面,然后使用mprotect来更改其对PROT_NONE的访问权限。这样,如果您超越了映射(但不超过1页)。

没有什么可以阻止您尝试使用该地区以外的地址。但是没有什么能保护您免受可能的后果。

它的行为可能好像该地区更大。它可能会示出(或平台上等效的内容)。它可能会覆盖随机的堆内存,从而导致您的程序以不可预测的方式表现不佳。它可能会做

C不提供保证您按照规则扮演的监护人。监护人很昂贵,如果您愿意,您将必须自己付款(通过编写警卫代码,并在必要时执行它)。

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

任何虚拟地址段(甚至来自SYSV IPCMEM的一个)都是该页面大小的倍数。使用 PAGESIZE或getPagesize(2)使用sysconf(3)获取它。

(Linux还具有"巨大页面",例如x86上的1mbytes)。

btw,阅读Proc(5),并考虑使用/proc/self/maps/proc/1234/maps进行PID 1234的过程以查询该过程的虚拟地址空间....

ps。喜欢使用SHM_OVERVIEW(7)。

最新更新