2012-03-12 256 views
0

如何获取c程序中信号量集中可能的最大信号量数量? 下面的程序得到了一套10 semaphored通过旗语ID semidC中设置的信号量的最大信号量数

#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功能,因此,它总是会在返回一组信号灯possibe的最大数量的定义系统(我的情况下为SEMMSL,250)。这不是#define声明。那么除了打开/proc/sys/kernel/sem文件以外,还有其他方法吗?

回答

1

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

但是,我在/ usr/include/linux中grep'd为250。它看起来像你追求生活/usr/include/linux/sem.h中的#define:

#define SEMMSL 250 

因此,假设Linux的头文件被安装,你应该能够#包括LINUX/sem.h中,并得到访问该SEMMSL定义。

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