gpt4 book ai didi

c - 使用共享内存运行程序时出现问题;有时会出现段错误; shmmax和shmall有关系吗?

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:02:11 28 4
gpt4 key购买 nike

你好,

我有一个程序,其中一个主进程产生 N 个工作人员,他们将反转图像的每一行,最后给我一个反转的图像。该程序使用共享内存和 posix 信号量,未命名的 sems,更具体地说,我在 terminate() 函数中使用带有 IPC_RMID 和 sem_close 和 sem_destroy 的 shmctl。但是,当我多次运行该程序时,有时它会给我一个段错误并且在第一个 shmget 中。我已经在内核中修改了我的 shmmax 值,但是我不能对 shmall 值做同样的事情,我不知道为什么。

有人可以帮帮我吗?为什么会发生这种情况,为什么不总是这样?代码看起来不错,给了我我想要的,高效等等......但有时我必须重新启动 Ubuntu 才能再次运行它,即使我认为我正在释放资源。

请赐教!

编辑:

以下是运行代码和 makefile 所需的 3 个文件:
http://pastebin.com/JqTkEkPv
http://pastebin.com/v7fQXyjs
http://pastebin.com/NbYFAGYq

http://pastebin.com/mbPg1QJm

你必须像这样运行它 ./invert someimage.ppm outimage.ppm(现在请用小的测试)

以下是一些可能很重要的值:

$ipcs -lm
------ Shared Memory Limits --------
max number of segments = 4096
max seg size (kbytes) = 262144
max total shared memory (kbytes) = 8388608
min seg size (bytes) = 1

$ipcs -ls

------ Semaphore Limits --------
max number of arrays = 128
max semaphores per array = 250
max semaphores system wide = 32000
max ops per semop call = 32
semaphore max value = 32767

编辑:段错误已解决!我在共享内存中分配一个 **array,这有点奇怪。所以,我只为一个 *array 分配了段,瞧。如果需要,请检查新代码并发表评论。

最佳答案

如果你所有的 sem_t POSIX 信号量都没有命名,你应该只对它们使用 sem_initsem_destroy 而永远不要 sem_close.

关于c - 使用共享内存运行程序时出现问题;有时会出现段错误; shmmax和shmall有关系吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4231260/

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