C-信号量sem#u getvalue不返回I';我在期待?

C-信号量sem#u getvalue不返回I';我在期待?,c,semaphore,C,Semaphore,我一直在努力让自己更加熟悉信号量,并想知道为什么这段代码没有打印出我期望的值 #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, &va

我一直在努力让自己更加熟悉信号量,并想知道为什么这段代码没有打印出我期望的值

#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;
}
#包括
#包括
#包括
int main(int argc,char*argv[]){
扫描电镜;
sem_init(&sem,0,1);
int值;
sem_getvalue(&sem,&value);
printf(“%d\n”,值);
返回0;
}
它为值打印0。但从我的理解来看,它应该得到我初始化信号量的值,它是1?我尝试在一些带有pthreads的代码中使用信号量,并用值1初始化了信号量,但是当我调用sem_getvalue函数时,它正在打印32767。我是不是遗漏了什么?提前谢谢

编辑:sem_init和sem_getvalue都返回-1


编辑:已解决。似乎没有在Mac上实现未命名的信号量。

我得到了预期的输出。(即1)

尝试使用与pthread库的链接

gcc sema.c -lpthread

它应该返回1,这是您初始化的值,
编译时应添加
-pthread
作为选项,例如
gcc-pthread test.c

如果代码运行良好,那么
sem_init()
sem_getvalue()
都应该返回0,
如果它们返回-1,则存在一些错误,您应该获取错误标志,并检查linux上的手册页以查看发生了什么错误。

顺便说一下,您的代码在my linux上返回1,这是正确的。
手册页:
man sem\u init
man sem\u getvalue

您应该获取sem_init()的错误标志,然后首先检查
mansem_init
,因为信号量似乎没有正确创建

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

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

您没有检查sem_init或sem_getvalue的返回值,这将是一个很好的起点,可以确保不会发生某些潜在错误。确切的代码,逐字逐句,在我的系统上打印1。0只意味着调用获取值成功。对于信号量,你不应该关心值,只关心它们的状态。嗯,它们都返回-1,这意味着它们失败了。我错过了什么?我需要什么标志吗?我运行了相同的代码,得到了
sem\u getvalue()=1
。因此,您的代码没有问题。我用
gcc del.c-lpthread
编译它,然后执行
/a.out
我这样编译:“gcc semtest.c-o semtest-lpthread”我得到它等于0。知道为什么吗。。。?太奇怪了,我一直在这么做。我认为这是因为Mac只支持命名信号量,所以像sem_open、sem_close等等,这并不是问题所在。你说的一切都已经在备忘录中讨论过了,因为我用的是Mac电脑。未实现未命名的信号量。@brokenfoot-pthread提供了比-lpthread更好的向后兼容性,如果您不理解它,请检查man gcc或google。