如何在c程序中设置的信号量中获得最大信号量?
以下程序获取由信号量标识semid
#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(在我的情况下)250中最大信号量的一组。它不是#define
声明。除了打开/proc/sys/kernel/sem
文件之外,有没有办法获得它?
答案 0 :(得分:2)
听起来你已经有了答案 - 打开/ proc / sys / kernel / sem并在你读出的第一个号码上调用atoi()。有时,解析/ proc文件系统是Linux问题的最佳解决方案。
但是,我在/ usr / include / linux中填写了250。看起来你寻求的#define生活在/usr/include/linux/sem.h中:
#define SEMMSL 250
因此,假设安装了Linux标头,您应该能够#include linux / sem.h并访问该SEMMSL定义。
这里的权衡是使用#define将SEMMSL硬编码到二进制文件中。如果您碰巧将二进制文件移动到另一台编号较小的计算机,我可以看到导致问题的原因。 FWIW,我刚刚检查了我正在运行的x86_32,x86_64和PowerPC Linux机器(所有最近的Ubuntu发行版)并且它们都报告了250.但是,通过/ proc文件系统进行解析可以获得正在运行的内核的当前限制我是一个更好的解决方案。