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

标签 c shared-memory sysv-ipc

我正在做的是:

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/

相关文章:

c - 了解 C 中函数指针的类型定义

c - 如何在 FreeBSD 中获取打开的 posix 共享内存段列表

c - shmat()等在Linux内核中是如何实现的。还有其他共享内存的方法吗?

c - System V 共享内存权限位 : meaning, 以及如何更改

c++ - 为什么在 Win32 中使用 `GetAsyncKeyState()` 时我的热键会出错?

c - **argv 参数的最大长度

c++ - 在 C/C++ 共享内存中等待和通知

使用 SysV 计数信号量

c - 确定预处理器中的优化级别?

共享内存中的 C 结构成员指针 (mmap)