这是Advanced Liniux Programming的摘录:
即使所有使用它们的进程都已终止,信号量仍然存在。 使用信号量集的最后一个进程必须显式删除它以确保 操作系统不会耗尽信号量。为此,请使用semctl调用 信号量标识符,集合中的信号量数量,IPC_RMID作为第三个参数, 和任何联合semun值作为第四个参数(被忽略) 调用进程的有效用户ID必须与信号量分配器的有效用户ID相匹配 (或调用者必须是root用户)。与共享内存段不同,删除信号量 set会导致Linux立即解除分配。
如果进程分配共享内存,并且许多进程使用它并且从未设置为删除它(使用shmctl),如果它们全部终止,则共享页面继续可用。 (我们可以通过ipcs看到这一点。)
如果某个进程执行了shmctl,那么当最后一个进程被释放时,系统将释放共享内存。
到目前为止一直很好(我想,如果没有,请纠正我)。
我从那句话中听不懂,首先是它说: “即使所有使用它们的进程都已终止,信号量仍然存在。” 然后: “与共享内存段不同,删除信号量集会导致Linux立即解除分配。”
答案 0 :(得分:2)
这两个陈述并不相互矛盾......
第一个语句表示信号量将继续存在,除非/直到某个程序明确删除它(即当最后一个程序停止使用它时它不会被自动删除)。
第二个语句说当程序删除信号量集时,linux会立即释放信号量集(而不是等待所有其他程序先停止使用它)