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

时间:2016-07-21 16:11:58

标签: centos posix semaphore

如果'没有对信号量的开放引用'(*)

,则删除信号量名称
  • 1)这些“参考”是什么?
  • 2)是否可以查询这些参考文献以确定所涉及的流程?

同一段继续详细阐述'如果没有对信号量的开放引用,那么它就会被销毁。否则,销毁将推迟到最后一个打开的参考被关闭“。 这对我来说意味着OS将继续查询这些引用,直到它能够破坏信号量。 这些“参考”比信号量的价值更多吗?

(*)W.R。 Stevens,S.A。Rago'在UNIX环境中的高级编程',第3版,第581.

1 个答案:

答案 0 :(得分:0)

"这些'参考'是什么?"

  

命名信号量由/somename形式的名称标识;那   是一个以null结尾的字符串,最多为 NAME_MAX -4(即251)   由初始斜杠组成的字符,后跟一个或多个   字符,没有一个是斜杠。两个进程可以运行   通过将相同的名称传递给sem_open(3)来获得相同的名称信号量。

这基本上意味着创建( O_CREAT 标志传递给sem_open(3))一个命名信号量(以/somename形式)的进程将允许另一个进程可以运行命名信号量是否具有足够的权限(基于创建该信号量的进程uid / gid以及传递给mode的{​​{1}})。

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

"是否可以查询这些参考文献以确定所涉及的流程?"

否(至少以POSIX方式)。

"这对我来说意味着操作系统将继续查询这些引用,直到它能够破坏信号量。"

虽然这是特定于实现的,但是操作系统不需要继续查询信号量以确定它是否可以取消链接。将其视为一个简单的参考计数器:如果sem_open(3)调用sem_unlink(),但Process#3Process#2仍在使用该信号量,则它的参考计数器将为2这点。您只需要在每次Process#1sem_close()调用时评估引用计数器值,以确定它何时达到0,然后有效地取消链接命名的信号量。