我想使用System V信号量实现一些POSIX信号量API,并发现此博客Implement POSIX Semaphore APIs using System V Semaphores APIs很有用。
我使用semget
(系统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信号量。允许的信号量集的数量非常小,因此我无法创建许多信号量。我怎么能摆脱它。
答案 0 :(得分:0)
我假设您正在询问如何增加系统限制。为此,您可以通过在Linux系统上运行以下命令来查找当前设置(或者也可以使用ipcs)
# cat /proc/sys/kernel/sem
250 32000 32 128
现在从手册页中我们看到以下输出中的四个值
SEMMSL
- 每个semid的最大信号量数量:依赖于实现(在Linux上,可以通过第一个字段读取和修改此限制 of / proc / sys / kernel / sem)。
SEMMNS
- 系统范围的最大信号量数量:取决于策略(在Linux上,可以通过第二个字段读取和修改此限制 的/ proc / SYS /内核/ SEM)。值大于SEMMSL * SEMMNI使其成为
不相关的。SEMOPM - 每个semop可执行的最大信号量操作数(2)
SEMMNI
- 系统范围内信号量集的最大数量:取决于策略(在Linux上,可以通过第四个字段读取和修改此限制) 的/ proc / SYS /内核/ SEM)。
现在,为了修改上述任何一个内核参数,您可以运行以下命令
# printf '250\t32000\t50\t150' >/proc/sys/kernel/sem