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

标签 centos posix semaphore

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

  • 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 to sem_open(3).

Thi 基本上意味着创建(O_CREAT 标志传递给 sem_open(3) )命名信号量(以 /somename 的形式)的进程将允许另一个进程可以在该命名信号量上操作,如果具有足够的权限(基于进程 uid/gid 创建该信号量以及 mode 传递给 sem_open(3) )。

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

“是否可以查询这些引用来识别所涉及的过程?”

否(至少,以 POSIX 方式)。

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

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

关于centos - 在 POSIX 命名信号量中,sem_unlink() 删除信号量的名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38509259/

相关文章:

centos - 无法在 CentOS 7 上安装 openmotif22

curl 请求在 centOS 上不工作但在 Ubuntu 上工作

c - 传递打开的目录作为参数

apache - Apache 的 Vagrant 同步文件夹权限问题

python - CentOS下Python 2.7.3安装MySQLDB

file-io - 读取文件而不从操作系统页面缓存中逐出

c - 为什么 sys/stat.h 不使用 -std=c1x 定义 ino_t?

java - Java中无法同步线程(使用信号量)

c++ - 如何将信号量与共享内存结合使用

c - 如果 sem_init() 被调用两次会发生什么?