c - "Cannot allocate memory"在 C 中使用 shmat 命令的共享内存问题

标签 c linux segmentation-fault ipc shared-memory

我有两个 C 程序需要相互通信。我在一个程序中使用 shmget(key, 27, IPC_CREAT | 0666) 将单个变量存储在共享内存中。我每 1 秒更新一次这个变量。在另一个程序中,我使用 shmget(key, 27, 0666) 每 1 秒访问一次。

这很好用,但一段时间后(通常是几个小时),检索数据的程序会因段错误而崩溃。我使用 gdb 将段错误定位到 shmget(key, 27, 0666) 行。返回的错误码为:

ENOMEM Could not allocate memory for the descriptor or for the page tables.

当我使用 ipcs -m 从命令提示符检查共享内存段时,我目前看到的是:

------ Shared Memory Segments --------
key        shmid      owner      perms      bytes      nattch     status      
0x00000000 65536      root       600        393216     2          dest         
0x00000000 98305      root       600        393216     2          dest         
0x00000000 131074     root       600        393216     2          dest         
0x00000000 163843     root       600        393216     2          dest         
0x00000000 196612     root       600        393216     2          dest         
0x00000000 229381     root       600        393216     2          dest         
0x00000000 262150     root       600        393216     2          dest         
0x00000000 294919     root       600        393216     2          dest         
0x00000000 327688     root       600        393216     2          dest         
0x00000000 589833     root       600        393216     2          dest         
0x00000000 655370     root       600        393216     2          dest         
0x00000000 524299     root       600        393216     2          dest         
0x00000000 688140     root       666        27         0                       
0x0008aa53 720909     root       666        27         31950                   
0x0006f855 753678     root       666        27         33564                   

在我看来,我使用的共享内存是否达到了某种最大值?但我不确定该怎么做,而且我通过谷歌搜索发现了很少的宝贵信息。有什么想法吗?该程序至少需要一次运行约 24 小时,甚至更长。

提前致谢。

最佳答案

您似乎误解了如何使用 Sys V 共享内存段。对于同一个共享内存段,您不需要在同一个进程中多次执行 shmget()。您应该通过 shmget() 获取段 ID,通过 shmat() 将其附加到您的内存空间,然后只需多次读取和/或写入它如你所愿。修改将对附加相同共享内存段的其他进程可见。

如果您仍然多次附加内存段,那么您必须确保每次都通过shmdt()de附加它,否则,是的,您最终会填满进程的整个地址空间。

此外,要正确使用共享内存,您需要某种同步机制。为此,对 Sys V 共享内存段的自然补充是 Sys V 信号量。您可以使用它来防止一个进程读取而另一个进程正在写入相同的数据。

关于c - "Cannot allocate memory"在 C 中使用 shmat 命令的共享内存问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27364174/

相关文章:

c - 需要帮助编写此乘法代码

linux - 如何在 linux 命令行中为 echo 设置变量

linux - ImageMagick 比较 shell 脚本好像挂了

python - 为什么在 Python 解释器中使用模数时会出现段错误?

c - 如何管理从 C 函数返回的内存

c - 在 C 中,为什么将指针初始化为 0 不会产生编译时错误?

c - 这个使用指针函数的C程序有什么问题

python - 如何在linux上的python中安装模块autopy?

c - 为什么这段代码会出现段错误?共享内存IPC SYSV

c - 递归导致的段错误