【发布时间】:2014-06-05 17:22:25
【问题描述】:
我正在运行下面的程序,并按照sem_open's man page:
如果一个进程重复调用
sem_open(),同名 参数,每次成功调用都返回相同的描述符, 除非在此期间在信号量上调用了sem_unlink()。
我希望sem1 和sem2 是相等的,但似乎它们不是。程序将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.04 和 FreeBSD 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