c - C中信号量集中的最大信号量数量

标签 c semaphore

如何获取 C 程序内信号量集中可能的最大信号量数量? 以下程序获取由信号量 id semid

定义的一组 10 个信号量
#include <sys/ipc.h>
#include <sys/sem.h>

key_t key;
int semid;

key = ftok("/home/somefile", 'E');
semid = semget(key, 10, 0666 | IPC_CREAT);

但是,如果我想调用 semget 函数,以便它始终返回系统中可能的最大信号量集(SEMMSL,250 in我的情况)。它不是#define 语句。那么除了打开 /proc/sys/kernel/sem 文件之外,还有其他方法可以获取它吗?

最佳答案

听起来你已经有了答案——打开/proc/sys/kernel/sem 并在你读出的第一个数字上调用 atoi() 。有时,解析/proc 文件系统是解决 Linux 问题的最佳方案。

但是,我在/usr/include/linux 中查找了 250。看起来您寻找的 #define 位于/usr/include/linux/sem.h 中:

#define SEMMSL  250 

因此,假设已安装 Linux header ,您应该能够 #include linux/sem.h 并访问该 SEMMSL 定义。

这里的权衡是使用#define 会将 SEMMSL 硬编码到您的二进制文件中。如果您碰巧将二进制文件移动到另一台具有较小数字的计算机,我可以看到这会导致问题。 FWIW,我刚刚检查了我正在运行的 x86_32、x86_64 和 PowerPC Linux 机器(所有最新的 Ubuntu 发行版),它们都报告 250。但是,通过解析/proc 文件系统可以为您提供正在运行的内核的当前限制,这会打击我作为一个更好的解决方案。

关于c - C中信号量集中的最大信号量数量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9667644/

相关文章:

javascript - 解决 C 中的 javascript 计数器困境

c - 在信号量中排队 - 甚至可能吗?

c - 生产者/消费者使用信号量

c - 生产者/消费者解决方案

c - 多线程初始化中的Unknown Segmentation Fault (Core Dumped)

c - 尝试用 C 编写输出偶数的代码

c - 预计 GCC ARM 寄存器

c - GDB:本地址越界时如何在$eax处找到 'passphrase'?

c - 如果我想清空目录,是否有任何理由不应该删除它并重新创建它?

与条件变量相比,队列应用程序中的 C++20 信号量似乎很慢