gpt4 book ai didi

c - 除了共享内存的大小之外,是什么阻止了我进一步读/写? (系统 V IPC)

转载 作者:太空宇宙 更新时间:2023-11-04 01:19:38 25 4
gpt4 key购买 nike

我正在做的是:

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

并且我已经将大小设置为正好 12 字节,但是当我尝试类似的操作时:

sprintf(shm_ptr, "假设这里有大约 200-300 个字符\n");

它似乎在零问题或警告的情况下正常工作,并且为了检查那个,我尝试从一个完全不同的过程中读取它(我 fork 并执行第一个)并且果然 p>

printf("%s", shm_ptr);

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

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

最佳答案

没有什么能阻止你,但规范不保证这种情况下的任何特定行为。

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

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

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

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

关于c - 除了共享内存的大小之外,是什么阻止了我进一步读/写? (系统 V IPC),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47479323/

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