【问题标题】:C++ Macs OS X semaphore.h: trouble with `sem_open()` and `sem_wait()`C++ Macs OS X semaphore.h:`sem_open()` 和 `sem_wait()` 的问题
【发布时间】:2011-11-09 10:27:24
【问题描述】:
#include <semaphore.h>

sem_t* x;

int main () 
{
    x = sem_open("x", O_CREAT, 0, 0);;
    sem_wait(x); sem_wait(x); sem_wait(x);
    std::cout << "\ndone\n";
}

此代码甚至不应该通过第一个sem_wait(),但在我的系统上它到达main() 的末尾。我读过的所有东西,比如herehere,都说,虽然Mac OS X 不支持sem_init(),但它确实支持sem_open()。但是,如上所述使用sem_open() 并没有解决问题。我正在运行 OS X 10.5.7。

【问题讨论】:

  • 你需要检查sem_open的返回值。如果是SEM_FAILED,则需要查看errno

标签: c++ macos semaphore


【解决方案1】:

尝试将sem_unlink("x"); 放在sem_open() 之前,我相信这不是您第一次尝试。并且模式 0 不会让您对它做太多事情,除非您将其删除。另外,请检查您的呼叫是否有错误,如果不能解决,但至少会修改您的问题。

【讨论】:

  • sem_unlink("x"); 成功了。这是否意味着在调用进程结束后命名信号量仍然存在,除非它被显式取消链接,从而导致O_CREAT 由于信号量已经存在而失败?但实际上我仍然不太明白这将如何解释这种行为。
  • 是的,它确实存在。问题不在于O_CREAT 标志,如果它不存在,它应该创建信号量(与O_EXCL 不同,它应该在存在时使其失败)。问题是信号量存在并限制了所有类型的访问(0 模式)。这就是为什么您需要先取消链接。
  • Kewl,就是这样!非常感谢。
【解决方案2】:

0 到sem_open 的权限意味着没有人可以访问信号量。你真的应该添加适当的错误检查——它会告诉你哪个函数失败了。

【讨论】:

  • 如果我想让调用进程不受限制的访问,我应该设置什么模式?
  • 我也是 :) 虽然不确定,但它与调用 process 有关,但尽可能接近。
猜你喜欢
  • 2011-10-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-05
  • 2012-03-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多