0

我正在尝试编写一个简单的信号量程序,并在 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;
    }

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

4

1 回答 1

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;
}

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

于 2013-03-02T05:46:25.910 回答