sem_wait POSIX API和OSX

时间:2013-03-02 05:31:07

标签: c xcode macos posix

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

基本上我除了用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;
    }

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

1 个答案:

答案 0 :(得分:2)

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信号量不是您想要的任务。