我一直试图让自己更熟悉信号量,并想知道为什么这段代码不能打印我期望的价值。
#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?我尝试在一些带有pthreads的代码中使用信号量,并使用值1初始化信号量,但是当我调用sem_getvalue函数时,它打印32767.我在这里遗漏了什么?提前谢谢。
编辑:sem_init和sem_getvalue都返回-1
编辑:已解决。似乎未命名的信号量在Mac上没有实现。
答案 0 :(得分:3)
我按预期获得输出。 (即1)
尝试使用链接与pthread库
gcc sema.c -lpthread
答案 1 :(得分:1)
它应该返回1,这是你初始化的值,
编译时应添加-pthread
作为选项,例如gcc -pthread test.c
如果代码运行良好,则sem_init()
和sem_getvalue()
都应返回0,
如果他们返回-1然后有一些错误,你应该得到错误标志,并检查linux上的手册页,看看发生了什么错误。
顺便说一句,你的代码在我的linux上返回1,这是正确的
手册页:man sem_init
和man sem_getvalue
。
您应该获得sem_init()的错误标志,然后首先检查man sem_init
,因为信号量似乎没有在第一时间正确创建。
答案 2 :(得分:0)
Edit: Solved. It appears unnamed semaphores aren't implemented on Mac.
在Mac OSX上,POSIX信号量被视为已弃用。因此,它无法按预期工作。