Centos 在POSIX命名信号量中,sem_unlink()删除信号量的名称

Centos 在POSIX命名信号量中,sem_unlink()删除信号量的名称,centos,posix,semaphore,Centos,Posix,Semaphore,如果“没有打开的信号量引用”(*),则删除信号量名称 1) 这些“参考”是什么 2) 是否可以查询这些参考以确定所涉及的流程 同一段继续阐述“如果没有对信号量的开放引用,那么它将被销毁。否则,销毁将推迟到最后一个打开的引用关闭。 对我来说,这意味着操作系统将继续查询这些引用,直到能够销毁信号量为止。 这些“引用”是否比信号量的值更多 (*)W.R.Stevens,S.A.Rago“UNIX环境中的高级编程”,第三版,第581页 “这些‘参考’是什么?” 一个命名的信号量由一个形式为/some

如果“没有打开的信号量引用”(*),则删除信号量名称

  • 1) 这些“参考”是什么
  • 2) 是否可以查询这些参考以确定所涉及的流程
同一段继续阐述“如果没有对信号量的开放引用,那么它将被销毁。否则,销毁将推迟到最后一个打开的引用关闭。 对我来说,这意味着操作系统将继续查询这些引用,直到能够销毁信号量为止。 这些“引用”是否比信号量的值更多

(*)W.R.Stevens,S.A.Rago“UNIX环境中的高级编程”,第三版,第581页

“这些‘参考’是什么?” 一个命名的信号量由一个形式为
/somename
的名称标识;那个 是一个以null结尾的字符串,最多为NAME_MAX-4(即251) 由初始斜杠,后跟一个或多个字符组成的字符 字符,其中没有一个是斜杠。有两个进程可以在计算机上运行 通过将相同的名称传递给
sem\u open(3)
来创建相同名称的信号量

这基本上意味着,创建一个命名信号量(以
/somename
的形式)的进程(O\u create标志传递给
sem\u open(3)
)将允许另一个进程在具有足够特权的情况下对该命名信号量进行操作(基于创建该信号量的进程
uid
/
gid
,以及传递给
sem\u open(3)
)的
模式

这是一种简单的方法(类似于打开同一文件的两个进程)在两个或多个不同进程上识别[并操作]相同的信号量

“能否查询这些引用以确定所涉及的流程?” 没有(至少,以POSIX的方式)

“对我来说,这意味着操作系统将继续查询这些引用,直到能够销毁信号量。”
虽然这是特定于实现的,但操作系统无需一直查询信号量以确定是否可以取消链接。请将其作为一个简单的参考计数器:if
sem_unlink()
Process#3
调用,但是
Process#2
Process#1
仍在使用该信号量,此时它的引用计数器将为2。您只需在每次
sem#close()
sem#unlink()时计算引用计数器值
调用以确定其何时达到0,然后有效地断开指定信号量的链接。

感谢您的回复。进程是否可以执行一个无序的sem_post(),从而导致挂起的进程错误地执行?@ovi您不必担心体系结构级别的实现。如果您遵循POSIX[定义的行为]规范,一切都必须按预期工作。我的问题是我的应用程序所面临的实际情况的结果。用户诱导的异步事件可能会触发一对断开的等待后处理。在尝试清理时,外部进程需要一种无条件断开链接并删除信号量的方法。我已尝试实现清理过程输入(任意)的s10个调用“POST”,然后取消链接-它似乎正在工作。我只是想确保我的解决方案,而蛮力,是有效的/合法的。@ Ovi I不能认为它是一个有效的解决方案。是的,它可能在你的情况下工作,但这不能解决问题,只会遮蔽它。工作的原因是有意义的,因为如果你增加信号量。[使用sem_post()]等待该信号量大于0的sem_wait()次数越多,将导致所有sem_wait()返回,然后取消阻止所有进程[以前在sem_wait()上锁定]。此信号量只有4个可能的参与者进程。计数不能大于4。我不是说此解决方案是一个完整的通用解决方案。