C语言-信号量sem_getvalue返回值与预期不符?

5

我一直在努力了解信号量,想知道为什么这段代码没有打印出我期望的值。

#include <semaphore.h>
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char * argv[]) {
    sem_t sem;
    sem_init(&sem, 0, 1);
    int value;
    sem_getvalue(&sem, &value);
    printf("%d\n",value);

    return 0;
}

它打印出0的值。但是根据我的理解,它应该得到我初始化信号量的值,即1?我尝试在一些使用pthread的代码中使用信号量,并使用值为1初始化了信号量,但是当我调用sem_getvalue函数时,它打印出32767。我错过了什么吗?提前感谢您的帮助。
编辑:sem_init和sem_getvalue都返回-1。
编辑:问题已解决。似乎Mac上未实现未命名信号量。

你没有检查sem_init和sem_getvalue的返回值,这是一个好的起点,以确保没有发生底层错误。在我的系统上,完全相同的代码打印1。 - caskey
2
0 只是表示获取值的调用成功了。使用信号量时,您不应该关心值,而只关心它们的状态。 - cory.todd
哦,它们都返回-1,这意味着它们失败了。我错过了什么吗?我需要一些标志或其他东西吗? - zProgrammer
我运行了相同的代码,得到了 sem_getvalue() = 1。所以,你的代码没有问题。我使用 gcc del.c -lpthread 编译它,然后执行 ./a.out - brokenfoot
我正在这样编译:"gcc semtest.c -o semtest -lpthread",但结果得到了0。你有什么想法为什么会这样吗?太奇怪了。 - zProgrammer
奇怪,显然Mac只支持命名信号量..? - zProgrammer
3个回答

5

我的输出符合预期。(即为1)

尝试使用链接pthread库。

gcc sema.c -lpthread

1
我一直在做这个。我认为这是因为Mac只支持命名信号量,如sem_open、sem_close等。 - zProgrammer

2
Edit: Solved. It appears unnamed semaphores aren't implemented on Mac.

在Mac OSX上,POSIX信号量被认为是过时的。因此,它不能按预期工作。


1
它应该返回1,这是您初始化的值,
编译时应添加选项-pthread,例如gcc -pthread test.c
如果代码运行良好,则sem_init()sem_getvalue()都应返回0,
如果它们返回-1,则存在某些错误,您应该获取错误标志,并检查Linux上的man页面以查看发生了什么错误。
顺便说一下,在我的Linux上,您的代码返回1,这是正确的。
man页面:man sem_initman sem_getvalue
对于sem_init(),您应该获取错误标志,然后首先检查man sem_init,因为似乎在第一次创建信号量时未正确创建。

并没有真正回答问题。你所说的一切在评论中已经讨论过了。 - brokenfoot
1
这是因为我正在使用Mac。未命名的信号量未实现。 - zProgrammer
@brokenfoot -pthread 提供比 -lpthread 更好的向后兼容性,如果你不理解,请查看 man gcc 或者在谷歌上搜索。 - Eric

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接