【问题标题】:How to implement sem_open using semget如何使用 semget 实现 sem_open
【发布时间】:2017-08-30 04:21:27
【问题描述】:

我想使用 System V 信号量实现一些 POSIX 信号量 API,并发现此博客 Implement POSIX Semaphore APIs using System V Semaphores APIs 很有用。

我使用semget(System V) 来实现sem_open(POSIX)。如下:

sem_t *sem_open(const char *name, int oflag, ...) {
    creat(fname, 0444);
    key_t key = ftok(name, 1);
    semget(key, 1, IPC_CREAT)
}

但是semget 返回 信号量集 标识符,而 sem_open 返回一个新的 POSIX 信号量。允许的信号量集的数量非常少,所以我不能创建很多信号量。我怎样才能摆脱它。

【问题讨论】:

  • 有没有简单的方法让semget 调用返回单个信号量而不是信号量集?

标签: c linux semaphore


【解决方案1】:

我假设您正在询问如何增加系统的限制。为此,您可以通过在 Linux 系统上运行以下命令来找到当前设置(或者 ipcs 也可以)

# cat /proc/sys/kernel/sem
250 32000   32  128

现在,我们从手册页中查看上述输出中的以下四个值

SEMMSL

  • 每个半标识符的最大信号量:取决于实现(在 Linux 上,可以通过第一个字段读取和修改此限制 /proc/sys/kernel/sem)。

SEMMNS

  • 系统范围的最大信号量数:取决于策略(在 Linux 上,可以通过第二个字段读取和修改此限制 /proc/sys/kernel/sem)。大于 SEMMSL * SEMMNI 的值使得它
    无关紧要。

SEMOPM - 每个 semop(2) 可以执行的最大信号量操作数

SEMMNI

  • 系统范围的最大信号量集数:取决于策略(在 Linux 上,可以通过
    的第四个字段读取和修改此限制 /proc/sys/kernel/sem)。

现在要修改上述任何一个内核参数,您可以运行以下命令

# printf '250\t32000\t50\t150' >/proc/sys/kernel/sem

【讨论】:

  • 哦,可能我没说清楚。我不想要一个正确的实现。
  • 也许你可以重新陈述你遇到的具体问题。你想摆脱什么?或者您要解决什么具体问题。
猜你喜欢
  • 1970-01-01
  • 2011-01-18
  • 1970-01-01
  • 1970-01-01
  • 2010-09-21
  • 1970-01-01
  • 2011-06-22
  • 2013-02-28
  • 1970-01-01
相关资源
最近更新 更多