首页
学习
活动
专区
圈层
工具
发布

和sem_wait
EN

Stack Overflow用户
提问于 2013-03-02 13:31:07
回答 1查看 2.2K关注 0票数 0

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

基本上,我只希望代码停止于sem_wait,而不是超越它。

编译代码并输出如下所示

代码语言:javascript
复制
Output:
-------
    Semaphore wait failed with ret code: -1, and err: 9. 
    Semaphore init failed with ret code: -1, and err: 9.

追溯到错误代码9,它是EBADF

我的程序是

代码语言:javascript
复制
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;
    }

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-03-02 13:46:26

sem_unlink接受信号量名称的char *sem_open接受相同的参数,并返回类型为sem_t *的信号量描述符。应该传递给sem_wait的就是这个信号量描述符。如果您修复了一些问题,使其实际编译时没有任何警告,就像下面的代码一样,那么它的行为就像您预期的那样:

代码语言:javascript
复制
#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信号量不是该任务所需的。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15171121

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档