【问题标题】:Why sem_open doesn't return the same value for the same name?为什么 sem_open 不为相同的名称返回相同的值?
【发布时间】:2014-06-05 17:22:25
【问题描述】:

我正在运行下面的程序,并按照sem_open's man page

如果一个进程重复调用sem_open(),同名 参数,每次成功调用都返回相同的描述符, 除非在此期间在信号量上调用了 sem_unlink()

我希望sem1sem2 是相等的,但似乎它们不是。程序将semaphores are not equal 打印到标准输出。

程序:

#include <err.h>
#include <semaphore.h>
#include <stdio.h>

int main(int argc, const char * argv[]) {
    const char *sem_name = "/sem";
    sem_t *sem1, *sem2;
    sem1 = sem_open(sem_name, O_CREAT, 0777, 0);
    sem2 = sem_open(sem_name, O_CREAT, 0777, 0);

    if (sem1 == SEM_FAILED || sem2 == SEM_FAILED) {
        printf("SEM_VALUE_MAX is %ud\n", SEM_VALUE_MAX);
        err(1, "SEM_FAILED");
    }

    if (sem1 != sem2) {
        printf("semaphores are not equal\n");
        return (2);
    }

    return (0);
}


关于我的环境的一些附加信息:

(jalcazar@mac ~)$ uname -a 
Darwin mac.local 13.2.0 Darwin Kernel Version 13.2.0: Thu Apr 17 23:03:13 PDT 2014; root:xnu-2422.100.13~1/RELEASE_X86_64 x86_64


另外The Open Group Base Specifications Issue 7 说:

如果一个进程多次成功调用sem_open() 名称相同的值,应返回相同的信号量地址 每个这样的成功调用。


我觉得我错过了一些非常基本的东西,但还没有弄清楚它是什么。
有什么提示吗?



编辑:
稍作修改的版本在 Ubuntu 13.04FreeBSD 10.0 上可以正常工作。
它在 OpenBSD 5.5 上打印 semaphores are not equal,但由于只有 bbf44dc795572df9c53f06b4ba06c4e51d8660a7502b8a0cd0b2b43081af314f.sem/tmp 中,因此假设它是同一个信号量是有意义的。

【问题讨论】:

  • 代码需要一些调整才能在 Linux 上编译,但我同意你的发现:Mac OS X 10.9.3 返回值 0x3 和 0x4(它们明显不同),但 Ubuntu 14.04 返回相同的(大)十六进制地址。手册页与实际行为不符。仅此差异就意味着某处存在错误。我想说问题出在实现中,而不是在符合 POSIX 的手册页中。

标签: c macos posix semaphore darwin


【解决方案1】:

您无法将sem_t*== 进行比较以确定它是否是同一个信号量。 sem1 == sem2 将检查 twp 指针是否相等,因为它们都来自同一个 sem_open() 调用,而不是它们是否引用相同的底层信号量。在这方面,OSX 手册页的措辞听起来有点不诚实。

但是,没有函数或运算符可用于检查两个 sem_t* 是否引用同一个信号量对象,尽管如果添加这些行,那么如果输出为 2,则可以合理地预测它们:

int val = 9;
sem_post(sem1);
sem_post(sem1);
sem_getvalue(sem2, &val);
printf("sem2 value=%d\n", val);

sem_t* 视为可能引用相同底层信号量的句柄。这与在同一个文件上调用 open() 两次非常相似,您会得到两个不同的文件描述符,但它们仍然引用同一个文件。

【讨论】:

  • 感谢您的回答。但是,由于 sem_getvalue 在 Mac OS X 上被破坏,我认为您的代码不会提供提示 sem1sem2 是否引用相同的底层信号量。见stackoverflow.com/questions/16655153/…heldercorreia.com/blog/semaphores-in-mac-os-x
  • 我不会将 ENOSYS 描述为“坏掉的”。
  • 正如刚刚在问题中编辑的那样,POSIX 还声明应该返回相同的地址,因此 OSX 手册页似乎与 POSIX 匹配,但行为不匹配
  • 第一段(或前几句)是假的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-21
  • 2011-09-28
相关资源
最近更新 更多