C: MAC OS X 中的信号量意外 sem_close 错误

Posted

技术标签:

【中文标题】C: MAC OS X 中的信号量意外 sem_close 错误【英文标题】:C: semphore in MAC OS X unexpected sem_close error 【发布时间】:2013-02-12 21:18:59 【问题描述】:

我试图在我的 Mac 上使用信号量,当我试图关闭一个打开的信号量时它会抛出一个错误。所有初始化都成功了,但是当它试图关闭第二个信号量时,它返回了错误的文件描述符错误。

以下代码是打开和关闭的包装:

void init_sem(sem_t * s, char * sema_name, int value)

    if((s = sem_open(sema_name, O_CREAT, 0644, value)) == SEM_FAILED)
    
        perror("sem_open");
        exit(1);
    
    printf("init semaphore %s\n", sema_name);

void destroy_sem(sem_t * s, char * sema_name)

    printf("destroying, %s\n", sema_name);
    if (sem_close(s) == -1) 
        perror("sem_close");
        exit(EXIT_FAILURE);
    

    if (sem_unlink(sema_name) == -1) 
        perror("sem_unlink");
        exit(EXIT_FAILURE);
    

在 main.c 中

sem_t * s, *a, *b;
init_sem(s, "/cs", 0);
init_sem(a, "/ps", 0);
init_sem(b, "/bs", 0);
destroy_sem(s, "/cs");
destroy_sem(a, "/ps"); //got error here
destroy_sem(b, "/bs");

知道为什么它不起作用吗?

【问题讨论】:

【参考方案1】:

你传入*s,它变成了一个局部变量。当您为其赋值时,当init_sem 返回时,该值消失。然后当您调用destroy_sim 时,您将一个未初始化的值传递给sem_close

你需要返回从sem_open返回的值:

sem_t * init_sem(char * sema_name, int value)

    sem_t * s;
    if((s = sem_open(sema_name, O_CREAT, 0644, value)) == SEM_FAILED)
    
        perror("sem_open");
        exit(1);
    
    printf("init semaphore %s\n", sema_name);
    return s;

然后这样称呼它:

s = init_sem("/cs", 0);
a = init_sem("/ps", 0);
b = init_sem("/bs", 0);

【讨论】:

哦,顺便说一句,为什么当我使用这个函数时编译器会抱怨来自整数的赋值指针..即使它们具有相同的类型【参考方案2】:

Gabe 的回答是正确的。

您也可以这样做:

void init_sem(sem_t ** s, char * sema_name, int value)

    if((*s = sem_open(sema_name, O_CREAT, 0644, value)) == SEM_FAILED)
    
        perror("sem_open");
        exit(1);
    
    printf("init semaphore %s\n", sema_name);

void destroy_sem(sem_t * s, char * sema_name)

    printf("destroying, %s\n", sema_name);
    if (sem_close(s) == -1) 
        perror("sem_close");
        exit(EXIT_FAILURE);
    

    if (sem_unlink(sema_name) == -1) 
        perror("sem_unlink");
        exit(EXIT_FAILURE);
    

int main (int argc, const char * argv[])

    sem_t * s, *a, *b;
    init_sem(&s, "/cs", 0);
    init_sem(&a, "/ps", 0);
    init_sem(&b, "/bs", 0);
    destroy_sem(s, "/cs");
    destroy_sem(a, "/ps");
    destroy_sem(b, "/bs");

【讨论】:

以上是关于C: MAC OS X 中的信号量意外 sem_close 错误的主要内容,如果未能解决你的问题,请参考以下文章

Mac OS X NTP 服务开启与关闭

clang++ mac os x c++11 链接器问题

将 c 程序编译成 MATLAB 格式 MAC OS X

mac os x 下查看dd命令刻录U盘的进度

在 Mac OS X 上打开时 IDLE 崩溃

照片误删恢复软件Jihosoft Photo Recovery 2.0.1 Mac OS X