在Linux 2.6.18下的执行结果为:
msg_qbytes:65536
msg_qnum:2
msg_cbytes:26
关于消息队列中允许存放最大的字节数可以通过IPC_SET命令进行修改,该修改只能针对本消息队列生效。如下测试代码:
int main(int argc, char **argv) { key_t key; key = CreateKey(PATH_NAME); int msgID; if ((msgID = msgget(key, IPC_CREAT | 0666)) < 0) { cout<<"open message queue failed..."; cout<<strerror(errno)<<endl; return -1; } msqid_ds msgInfo; msgctl(msgID, IPC_STAT, &msgInfo); cout<<"msg_qbytes:"<<msgInfo.msg_qbytes<<endl; cout<<"msg_qnum:"<<msgInfo.msg_qnum<<endl; cout<<"msg_cbytes:"<<msgInfo.msg_cbytes<<endl; msgInfo.msg_qbytes = 6553600; if (msgctl(msgID, IPC_SET, &msgInfo) < 0) { cout<<"set message queue failed..."; cout<<strerror(errno)<<endl; return -1; } msgctl(msgID, IPC_STAT, &msgInfo); cout<<"msg_qbytes:"<<msgInfo.msg_qbytes<<endl; cout<<"msg_qnum:"<<msgInfo.msg_qnum<<endl; cout<<"msg_cbytes:"<<msgInfo.msg_cbytes<<endl; return 0; } |
在Linux 2.6.18下的执行结果为:
msg_qbytes:65536
msg_qnum:0
msg_cbytes:0
msg_qbytes:6553600
msg_qnum:0
msg_cbytes:0
4 System V消息队列的内核限制
对System V IPC,系统往往会存在一些限制,对于消息队列,在Linux2.6.18中,系统内核存在以下限制:
[root@idcserver program]# sysctl -a |grep msg
kernel.msgmnb = 65536 //一个消息队列上允许的最大字节数
kernel.msgmni = 16 //系统范围内允许存在的最大消息队列数
kernel.msgmax = 65536 //每个消息的最大字节数
对于System V消息队列一般内核还有一个限制:系统范围内的最大消息数,在Linux下这个限制由msgmnb*msgmni决定。
上面已经说过可以通过IPC_SET来设置使用中的消息队列的最大字节数。但是要在系统范围内对内核限制进行修改,在Linux下面可以通过修改/etc/sysctl.conf内核参数配置文件,然后配合sysctl命令来对内核参数进行设置。例如下面示例:
[root@idcserver program]#echo "kernel.msgmnb = 6553600" >>/etc/sysctl.conf
[root@idcserver program]#echo "kernel.msgmni = 100" >>/etc/sysctl.conf
[root@idcserver program]#echo "kernel.msgmax = 6553600" >>/etc/sysctl.conf
[root@idcserver program]#sysctl -p
[root@idcserver program]# sysctl -a |grep msg
kernel.msgmnb = 6553600
kernel.msgmni = 100
kernel.msgmax = 6553600