【问题标题】:In POSIX named semaphores, sem_unlink() removes the name of the semaphore在 POSIX 命名信号量中,sem_unlink() 删除信号量的名称
【发布时间】:2016-07-21 16:11:58
【问题描述】:

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

  • 1) 这些“参考”是什么?
  • 2) 是否可以查询这些引用以确定所涉及的进程?

同一段继续详细说明'如果没有对信号量的开放引用,则将其销毁。否则,销毁将推迟到最后一个打开的引用关闭'。 这对我来说意味着操作系统将继续查询这些引用,直到它能够破坏信号量。 这些“引用”是否比信号量的值更多?

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

【问题讨论】:

    标签: centos posix semaphore


    【解决方案1】:

    “这些‘引用’是什么?”

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

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

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

    “是否可以查询这些引用以确定所涉及的进程?”

    否(至少,以 POSIX 方式)。

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

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

    【讨论】:

    • 感谢您的回复。进程能否执行无序的 sem_post() 从而导致挂起的进程错误执行?
    • @ovi 您无需担心架构级别的实现。如果您遵循 POSIX [定义的行为] 规范,那么一切都必须按预期工作。
    • 我的问题是我的应用程序面临的实际情况的结果。用户引发的异步事件可以触发一对损坏的等待发布。在尝试清理它时,外部进程需要一种方法来无条件地取消链接和删除信号量。我试图实现一个清理过程,将(任意)10 次调用“发布”然后取消链接 - 它似乎正在工作。我只是想确保我的解决方案虽然蛮力但有效/合法。
    • @ovi 我不能认为它是一个有效的解决方案。是的,它可能适用于您的情况,但这并不能解决问题,只会掩盖它。这样做的原因是有道理的,因为如果您将信号量 [with sem_post()] 增加 sem_wait() 等待该信号量大于 0 继续执行的次数,将导致所有 sem_wait() 返回,然后解除所有进程的阻塞[之前锁定在 sem_wait()]。
    • 这个信号量只有 4 个可能的参与进程。计数不能大于 4。我并不是说这个解决方案是一个完整的通用解决方案。
    猜你喜欢
    • 2012-08-01
    • 1970-01-01
    • 2011-07-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-20
    • 2020-03-20
    • 1970-01-01
    相关资源
    最近更新 更多