如果“没有对信号量的开放引用”,则删除信号量名称(*)
- 1) 这些“引用资料”是什么?
- 2) 能否查询这些引用资料以确定所涉及的流程?
同一段继续阐述“如果没有对信号量的开放引用,则将其销毁”。否则,销毁被推迟到最后一个打开的引用被关闭'。 这对我来说意味着操作系统将继续查询这些引用,直到它能够破坏信号量。 除了信号量的值之外,这些“引用”是否还有更多信息?
(*)W.R. Stevens, S.A. Rago “UNIX 环境中的高级编程”,第 3 版,第 12 页。 581.
最佳答案
“这些‘引用’是什么?”
A named semaphore is identified by a name of the form
/somename
; that is, a null-terminated string of up to NAME_MAX-4 (i.e., 251) characters consisting of an initial slash, followed by one or more characters, none of which are slashes. Two processes can operate on the same named semaphore by passing the same name tosem_open(3)
.
Thi 基本上意味着创建(O_CREAT 标志传递给 sem_open(3)
)命名信号量(以 /somename
的形式)的进程将允许另一个进程可以在该命名信号量上操作,如果具有足够的权限(基于进程 uid
/gid
创建该信号量以及 mode
传递给 sem_open(3)
)。
这是一种在两个或多个不同进程上识别[并操作]相同信号量的简单方法(类似于两个进程打开同一个文件)。
“是否可以查询这些引用来识别所涉及的过程?”
否(至少,以 POSIX 方式)。
“这对我来说意味着操作系统将继续查询这些引用,直到它能够破坏信号量。”
虽然这是特定于实现的,但是操作系统不需要继续查询信号量以确定它是否可以取消链接。将其视为一个简单的引用计数器:If sem_unlink()
由 Process#3
调用,但是Process#2
和 Process#1
仍在使用该信号量,此时它的引用计数器将为 2。您只需要在每个 sem_close()
评估引用计数器值或 sem_unlink()
调用以确定它何时达到 0,然后有效地取消链接命名的信号量。
关于centos - 在 POSIX 命名信号量中,sem_unlink() 删除信号量的名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38509259/