【问题标题】:sem_wait POSIX API and OSXsem_wait POSIX API 和 OSX
【发布时间】:2013-03-02 16:25:52
【问题描述】:

我正在尝试编写一个简单的信号量程序,并在 OSX 中发现了一些不同的东西。我使用 Mountain Lion 和最新的 Xcode 版本。忘记了缺少大括号的语法错误..因为我下面有更多代码,没有复制完整的sn-p,

基本上我除了用 sem_wait 停止而不超出的代码。

代码编译输出如下

Output:
-------
    Semaphore wait failed with ret code: -1, and err: 9. 
    Semaphore init failed with ret code: -1, and err: 9.

回溯到错误码9,就是EBADF

我的程序是

int main(int argc, char * argv[])
{
    pthread_t tid1, tid2;
    int rc;

    rc = sem_unlink(&mutex);
    rc = sem_open(&mutex, O_CREAT,O_RDWR,0);
    rc = sem_wait(&mutex);

    if(rc == 0) {
        printf("Semaphore try wait ok!. \n");
    } else {
        printf("Semaphore wait failed with ret code: %d, and err: %d. \n",
               rc, errno);
    }

    if(rc != SEM_FAILED) {
        printf("Semaphore init ok!. \n");
    } else {
        printf("Semaphore init failed with ret code: %d, and err: %d. \n",
               rc, errno);
        return 0;
    }

这里的任何帮助都是非常宝贵的。

【问题讨论】:

  • 你能发布实际编译的代码吗? mutex 没有在任何地方声明。 sem_unlinksem_open 采用 char *sem_wait 采用 sem_t * 但您将相同的值传递给所有三个。 errno 值为 9 (EBADF) 与将错误数据传递给 sem_wait 一致。
  • 您正在尝试等待失败的打开呼叫。可能是互斥体初始化的问题。

标签: c xcode macos posix


【解决方案1】:

sem_unlink 采用char *,即信号量的名称。 sem_open 采用相同的方式,并返回 sem_t * 类型的信号量描述符。您应该将这个信号量描述符传递给sem_wait。如果你修复了一些问题,让它在没有警告的情况下实际编译,就像下面的代码,那么它的行为就像你期望的那样:

#include <semaphore.h>
#include <stdio.h>
#include <sys/errno.h>


int main(int argc, char **argv)
{
    const char *semaphore_name = "my-test-semaphore";

    int rc = sem_unlink(semaphore_name);
    if (rc)
        perror("sem_unlink");

    sem_t *semaphore = sem_open(semaphore_name, O_CREAT, O_RDWR, 0);
    if (semaphore == SEM_FAILED) {
        perror("sem_open");
        return 1;
    }

    rc = sem_wait(semaphore);
    if (rc) {
        perror("sem_wait");
        return 1;
    }

    return 0;
}

您还应该注意problems with POSIX semaphores,即如果您的应用程序意外退出,很容易泄漏信号量计数。您的示例代码提到pthread_t 的事实表明您正在尝试在单个进程中使用信号量。命名的 POSIX 信号量不是你想要的那个任务。

【讨论】:

  • POSIX 信号量是完成该任务的完美工具,但您需要匿名信号量(由sem_init 创建),而不是命名信号量。不幸的是,OSX 有问题,匿名信号量在它上面不起作用。
  • bdash - 你说得对,我把参数弄乱了。并将错误的类型传递给 sen_wait。,
  • 感谢 R.. 的澄清,我已经调整了措辞,以明确我指的是 named POSIX 信号量,而不是一般的 POSIX 信号量。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多