【问题标题】:C- Semaphore sem_getvalue not returning what I'm expecting?C- Semaphore sem_getvalue 没有返回我所期望的?
【发布时间】:2014-04-18 03:32:00
【问题描述】:

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

#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 上实现未命名的信号量。

【问题讨论】:

  • 您没有检查 sem_init 或 sem_getvalue 的返回值,这将是一个很好的起点,以确保不会发生某些潜在错误。那个确切的代码,逐字逐句在我的系统上打印 1。
  • 0 仅表示获取值的调用成功。使用信号量时,您不应该关心值,而只关心它们的状态。
  • 嗯,他们都返回 -1,这意味着他们失败了。我错过了什么?有什么我需要的标志吗?
  • 好吧,我运行了相同的代码,得到了sem_getvalue() = 1。因此,您的代码没有任何问题。我用gcc del.c -lpthread编译它然后执行./a.out
  • 我正在编译:“gcc semtest.c -o semtest -lpthread” 我知道它等于 0。知道为什么...?好奇怪。

标签: c semaphore


【解决方案1】:

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

尝试使用与 pthread 库的链接

gcc sema.c -lpthread

【讨论】:

  • 我一直在这样做。我认为这是因为 Mac 只支持命名信号量,例如 sem_open、sem_close 等。
【解决方案2】:
Edit: Solved. It appears unnamed semaphores aren't implemented on Mac.

POSIX 信号量在 Mac OSX 上被视为已弃用。因此,它无法按预期工作。

【讨论】:

    【解决方案3】:

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

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

    顺便说一句,您的代码在我的 linux 上返回 1,这是正确的。
    手册页:man sem_initman sem_getvalue
    你应该得到 sem_init() 的错误标志,然后首先检查man sem_init,因为信号量似乎一开始就没有正确创建。

    【讨论】:

    • 确实不是问题。你所说的一切都已经在评论中讨论过了。
    • 这是因为我使用的是 Mac。未实现未命名的信号量。
    • @brokenfoot -pthread 提供比 -lpthread 更好的向后兼容性,如果您不理解,请查看 man gcc 或 google。
    猜你喜欢
    • 2021-05-30
    • 1970-01-01
    • 2021-12-11
    • 2018-05-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多