System
VÏûÏ¢¶ÓÁÐÊÇOpen Group¶¨ÒåµÄXSI£¬²»ÊôÓÚPOSIX±ê×¼¡£System V IPCµÄÀúÊ·Ïà¶ÔºÜÔ磬ÔÚÉϸöÊÀ70Äê´úºóÆÚÓб´¶ûʵÑéÊҵķÖÖ§»ú¹¹¿ª·¢£¬80Äê´ú¼ÓÈëSystem
VµÄϵͳÄÚºËÖУ¬ºóÀ´ÉÌÓÃUNIXϵͳ»ù±¾¶¼¼ÓÈëÁËSystem V IPCµÄ¹¦ÄÜ¡£
System VÏûÏ¢¶ÓÁÐÏà¶ÔÓÚPOSIXÏûÏ¢¶ÓÁеÄÇø±ðÖ÷ÒªÊÇ£º
POSIXÏûÏ¢¶ÓÁеĶÁ²Ù×÷×ÜÊÇ·µ»ØÏûÏ¢¶ÓÁÐÖÐÓÅÏȼ¶×î¸ßµÄ×îÔçÏûÏ¢£¬¶ø¶ÔÓÚSystem
VÏûÏ¢¶ÓÁпÉÒÔ·µ»ØÈÎÒâÖ¸¶¨ÓÅÏȼ¶£¨Í¨¹ýÏûÏ¢ÀàÐÍ£©µÄÏûÏ¢¡£
µ±ÏòÒ»¸ö¿ÕÏûÏ¢¶ÓÁÐÖÐдÈëÒ»¸öÏûϢʱ£¬POSIXÏûÏ¢¶ÓÁÐÔÊÐí²úÉúÒ»¸öÐźŻòÆô¶¯Ò»¸öỊ̈߳¬System
VÏûÏ¢¶ÓÁв»ÌṩÀàËÆµÄ»úÖÆ¡£
ϵͳÄں˶¼»áΪÿһ¸öSystem VÏûÏ¢¶ÓÁÐά»¤Ò»¸öÐÅÏ¢½á¹¹£¬ÔÚLinux
2.6.18Öе͍ÒåÈçÏ£º
<bits/msq.h> struct msqid_ds { struct ipc_perm msg_perm; /*IPC¶ÔÏóµÄÊôÐÔÐÅÏ¢ºÍ·ÃÎÊȨÏÞ */ __time_t msg_stime; /* time of last msgsnd command */ __time_t msg_rtime; /* time of last msgrcv command */ __time_t msg_ctime; /* time of last change */ unsigned long int __msg_cbytes; /* µ±Ç°¶ÓÁÐÖÐÏûÏ¢µÄ×Ö½ÚÊý */ msgqnum_t msg_qnum; /* µ±Ç°¶ÓÁÐÖÐÏûÏ¢µÄ¸öÊý */ msglen_t msg_qbytes; /* ¶ÓÁÐÔÊÐí´æ·ÅµÄ×î´ó×Ö½ÚÊý */ __pid_t msg_lspid; /* pid of last msgsnd() */ __pid_t msg_lrpid; /* pid of last msgrcv() */ //ÏÂÃæÊDZ£Áô×Ö¶Î #if __WORDSIZE == 32 unsigned long int __unused1; unsigned long int __unused2; unsigned long int __unused3; #endif unsigned long int __unused4; unsigned long int __unused5; }; |
ÏûÏ¢¶ÓÁеĽṹ¿ÉÄܵÄÉè¼ÆÈçÏ£º

1 System VÏûÏ¢¶ÓÁеĴ´½¨ºÍ´ò¿ª
System VÏûÏ¢¶ÓÁеĴ´½¨ºÍʹÓûáʹÓÃÏÂÃæµÄº¯Êý½Ó¿Ú£º
#include
¡¡¡¡int msgget(key_t key, int oflg);
¡¡¡¡//³É¹¦·µ»Ø·Ç¸ºÏûÏ¢¶ÓÁÐÃèÊö·û£¬Ê§°Ü·µ»Ø-1
|
key£ºÏûÏ¢¶ÓÁеļü£¬ÓÃÀ´´´½¨Ò»¸öÏûÏ¢¶ÓÁС£System IPC¶¼ÓÐÒ»¸ökey£¬×÷ΪIPCµÄÍⲿ±êʶ·û£¬´´½¨³É¹¦ºó·µ»ØµÄÃèÊö·û×÷ΪIPCµÄÄÚ²¿±êʶ·ûʹÓá£keyµÄÖ÷ҪĿµÄ¾ÍÊÇʹ²»Í¬½ø³ÌÔÚͬһIPC»ãºÏ¡£key¾ßÌå˵¿ÉÒÔÓÐÈýÖÖ·½Ê½Éú³É£º
1.²»Í¬µÄ½ø³ÌÔ¼¶¨ºÃµÄÒ»¸öÖµ£»
2.ͨ¹ýÏàͬµÄ·¾¶ÃûºÍÏîÄ¿ID£¬µ÷ÓÃftok()º¯Êý£¬Éú³ÉÒ»¸ö¼ü£»
3.»¹¿ÉÒÔÉèÖÃΪIPC_PRIVATE£¬ÕâÑù¾Í»á´´½¨Ò»¸öеģ¬Î¨Ò»µÄIPC¶ÔÏó£»È»ºó½«·µ»ØµÄÃèÊö·ûͨ¹ýijÖÖ·½Ê½´«µÝ¸øÆäËû½ø³Ì£»
oflg£ºÖ¸¶¨´´½¨»ò´ò¿ªÏûÏ¢¶ÓÁеıêÖ¾ºÍ¶ÁдȨÏÞ£¨ipc_permÖеÄmode³ÉÔ±£©¡£ÎÒÃÇÖªµÀSystem
V IPC¶¨ÒåÁË×Ô¼ºµÄ²Ù×÷±êÖ¾ºÍȨÏÞÉèÖñêÖ¾£¬¶øÇÒ¶¼ÊÇͨ¹ý¸Ã²ÎÊý´«µÝ£¬ÕâºÍopenº¯Êý´æÔÚ²î±ð£¬openº¯ÊýµÚÈý¸ö²ÎÊýmodeÓÃÓÚ´«µÝÎļþµÄȨÏÞ±êÖ¾¡£System
V IPCµÄ²Ù×÷±êÖ¾°üº¬£ºIPC_CREAT£¬IPC_EXCL£¬È¨ÏÞÉèÖñêÖ¾ÈçÏÂͼ£º

ÏÂÃæÊÇ´´½¨ÏûÏ¢¶ÓÁеIJâÊÔ´úÂ룺
#include <iostream> #include <cstring> #include <errno.h> #include <unistd.h> #include <fcntl.h> #include <sys/msg.h> using namespace std; #define PATH_NAME "/tmp/anonymQueue" int main(int argc, char **argv) { key_t key; int fd; if ((fd = open(PATH_NAME, O_CREAT, 0666)) < 0) { cout<<"open file "<<PATH_NAME<<"failed."; cout<<strerror(errno)<<endl; return -1; } close(fd); key = ftok(PATH_NAME, 0); int msgID; if ((msgID = msgget(key, IPC_CREAT | 0666)) < 0) { cout<<"open message queue failed..."; cout<<strerror(errno)<<endl; return -1; } cout<<"key:0x"<<hex<<key<<endl; cout<<"descriptor id:"<<dec<<msgID<<endl; } |
ÔÚLinux 2.6.18ÏÂÔËÐнá¹û£º
key:0x8015
¡¡¡¡descriptor id:917511
|
ʵÏÖSystem V IPCµÄÈκÎϵͳ¶¼ÌṩÁ½¸öÌØÊâµÄ³ÌÐòipcsºÍipcrm¡£ipcsÊä³öIPCµÄ¸÷ÖÖÐÅÏ¢£¬ipcrmÔòÓÃÓÚɾ³ý¸÷ÖÖSystem
V IPC¡£ÓÉÓÚSystem V IPC²»ÊôÓÚPOSIX±ê×¼£¬ËùÒÔÕâÁ½¸öÃüÁîҲδ±»±ê×¼»¯¡£ÏÂÃæÊÇͨ¹ýipcsÃüÁîÀ´²é¿´¸Õ¸Õ´´½¨µÄÏûÏ¢¶ÓÁС£
[root@idcserver program]# ipcs -q -i 917511 ¡¡¡¡Message Queue msqid=917511 ¡¡¡¡uid=0 gid=0 cuid=0 cgid=0 mode=0666 ¡¡¡¡cbytes=0 qbytes=65536 qnum=0 lspid=0 lrpid=0 ¡¡¡¡send_time=Not set ¡¡¡¡rcv_time=Not set ¡¡¡¡change_time=Wed Aug 7 16:39:46 2013 |
2 System VÏûÏ¢¶ÓÁеÄʹÓÃ
System VÏûÏ¢¶ÓÁеÄдÈëÏûϢʹÓÃÏÂÃæµÄº¯Êý½Ó¿Ú£º
#include <sys/msg.h> ¡¡¡¡int msgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg); ¡¡¡¡//³É¹¦·µ»Ø0£¬Ê§°Ü·µ»Ø-1 |
msqid£ºÏûÏ¢¶ÓÁеÄÃèÊö·û£»
msgp£ºÖ¸Ïò´æ·ÅÏûÏ¢µÄ»º³åÇø£¬¸Ã»º³åÇøÖаüº¬ÏûÏ¢ÀàÐͺÍÏûÏ¢ÌåÁ½²¿·ÖÄÚÈÝ¡£¸Ã»º³åÇøµÄ½á¹¹ÊÇÓÉÓû§¶¨ÒåµÄ£¬ÔÚ<sys/msg.h>ÖÐÓйØÓڸûº³åÇø½á¹¹¶¨ÒåµÄ²Î°æ¿¼Ä££º
struct msgbuf ¡¡¡¡{ ¡¡¡¡long int mtype; /* type of received/sent message */ ¡¡¡¡char mtext[1]; /* text of the message */ ¡¡¡¡}; |
»º³åÇøµÄ¿ªÍ·ÊÇÒ»¸ölongÐ͵ÄÏûÏ¢ÀàÐÍ£¬¸ÃÏûÏ¢ÀàÐͱØÐëÊÇÒ»¸ö·Ç¸ºÊý¡£½ô¸úÔÚÏûÏ¢ÀàÐͺóÃæµÄÊÇÏûÏ¢Ì岿·Ö£¨Èç¹ûÏûÏ¢³¤¶È´óÓÚ0£©£¬²Î¿¼Ä£°æÖж¨ÒåµÄmtextÖ»ÊÇ˵Ã÷ÏûÏ¢Ì壬¸Ã²¿·Ö¿ÉÒÔ×Ô¶¨Ò峤¶È¡£ÎÒÃÇ×Ô¼ºµÄÓ¦Óö¼»á¶¨ÒåÌØ¶¨µÄÏûÏ¢½á¹¹¡£
msgsz£º»º³åÇøÖÐÏûÏ¢Ì岿·ÖµÄ³¤¶È£»
msgflg£ºÉèÖòÙ×÷±êÖ¾¡£¿ÉÒÔΪ0£¬IPC_NOWAIT£»ÓÃÓÚÔÚÏûÏ¢¶ÓÁÐÖÐûÓпÉÓõĿռäʱ£¬µ÷ÓÃÏ̲߳ÉÓúÎÖÖ²Ù×÷·½Ê½¡£
±ê־ΪIPC_NOWAIT£¬±íʾmsgsnd²Ù×÷ÒÔ·Ç×èÈûµÄ·½Ê½½øÐУ¬ÔÚÏûÏ¢¶ÓÁÐÖÐûÓпÉÓõĿռäʱ£¬msgsnd²Ù×÷»áÁ¢¿Ì·µ»Ø¡£²¢Ö¸¶¨EAGAIN´íÎó£»
±ê־Ϊ0£¬±íʾmsgsnd²Ù×÷ÒÔ×èÈûµÄ·½Ê½½øÐУ¬ÕâÖÖÇé¿öÏÂÔÚÏûÏ¢¶ÓÁÐÖÐûÓпÉÓõĿռäʱµ÷ÓÃÏ̻߳ᱻ×èÈû£¬Ö±µ½ÏÂÃæµÄÇé¿ö·¢Éú£º
µÈµ½Óдæ·ÅÏûÏ¢µÄ¿Õ¼ä£»
ÏûÏ¢¶ÓÁдÓϵͳÖÐɾ³ý£¬ÕâÖÖÇé¿öÏ»طµ»ØÒ»¸öEIDRM´íÎó£»
µ÷ÓÃÏ̱߳»Ä³¸ö²¶×½µ½µÄÐźÅÖжϣ¬ÕâÖÖÇé¿öÏ·µ»ØÒ»¸öEINTR´íÎó£»
System VÏûÏ¢¶ÓÁеĶÁÈ¡ÏûϢʹÓÃÏÂÃæµÄº¯Êý½Ó¿Ú£º
#include <sys/msg.h> ¡¡¡¡ssize_t msgrcv(int msqid, void *msgp, size_t msgsz, long msgtyp, int msgflg); ¡¡¡¡//³É¹¦·µ»Ø½ÓÊÕµ½µÄÏûÏ¢µÄÏûÏ¢ÌåµÄ×Ö½ÚÊý£¬Ê§°Ü·µ»Ø-1 |
msqid£ºÏûÏ¢¶ÓÁеÄÃèÊö·û£»
msgp£ºÖ¸Ïò´ý´æ·ÅÏûÏ¢µÄ»º³åÇø£¬¸Ã»º³åÇøÖн«»á´æ·Å½ÓÊÕµ½µÄÏûÏ¢µÄÏûÏ¢ÀàÐͺÍÏûÏ¢ÌåÁ½²¿·ÖÄÚÈÝ¡£¸Ã»º³åÇøµÄ½á¹¹ÊÇÓÉÓû§¶¨ÒåµÄ£¬ºÍmsgsndÏà¶ÔÓ¦¡£
msgsz£º»º³åÇøÖÐÄÜ´æ·ÅÏûÏ¢Ì岿·ÖµÄ×î´ó³¤¶È£¬ÕâÒ²ÊǸú¯ÊýÄÜ·µ»ØµÄ×î´óÊý¾ÝÁ¿£»¸Ã×ֶεĴóСӦ¸ÃÊÇsizeof(msg
buffer) - sizeof(long)£»
msgtyp£ºÏ£Íû´ÓÏûÏ¢¶ÓÁÐÖлñÈ¡µÄÏûÏ¢ÀàÐÍ¡£
msgtypΪ0£¬·µ»ØÏûÏ¢¶ÓÁÐÖеĵÚÒ»¸öÏûÏ¢£»
msgtyp > 0£¬·µ»Ø¸ÃÏûÏ¢ÀàÐ͵ĵÚÒ»¸öÏûÏ¢£»
msgtyp < 0£¬·µ»ØÐ¡ÓÚ»òµÈÓÚmsgtyp¾ø¶ÔÖµµÄÏûÏ¢ÖÐÀàÐÍ×îСµÄµÚÒ»¸öÏûÏ¢£»
msgflg£ºÉèÖòÙ×÷±êÖ¾¡£¿ÉÒÔΪ0£¬IPC_NOWAIT£¬MSG_NOERROR£»ÓÃÓÚÔÚÏûÏ¢¶ÓÁÐÖÐûÓпÉÓõÄÖ¸¶¨ÏûϢʱ£¬µ÷ÓÃÏ̲߳ÉÓúÎÖÖ²Ù×÷·½Ê½¡£
±ê־ΪIPC_NOWAIT£¬±íʾmsgrcv²Ù×÷ÒÔ·Ç×èÈûµÄ·½Ê½½øÐУ¬ÔÚÏûÏ¢¶ÓÁÐÖÐûÓпÉÓõÄÖ¸¶¨ÏûϢʱ£¬msgrcv²Ù×÷»áÁ¢¿Ì·µ»Ø£¬²¢É趨errnoΪENOMSG¡£
±ê־Ϊ0£¬±íʾmsgrcv²Ù×÷ÊÇ×èÈû²Ù×÷£¬Ö±µ½ÏÂÃæµÄÇé¿ö·¢Éú£º
ÏûÏ¢¶ÓÁÐÖÐÓÐÒ»¸öËùÇëÇóµÄÏûÏ¢ÀàÐÍ¿ÉÒÔ»ñÈ¡£»
ÏûÏ¢¶ÓÁдÓϵͳÖÐɾ³ý£¬ÕâÖÖÇé¿öÏ»طµ»ØÒ»¸öEIDRM´íÎó£»
µ÷ÓÃÏ̱߳»Ä³¸ö²¶×½µ½µÄÐźÅÖжϣ¬ÕâÖÖÇé¿öÏ·µ»ØÒ»¸öEINTR´íÎó£»
±ê־ΪMSG_NOERROR£¬±íʾ½ÓÊÕµ½µÄÏûÏ¢µÄÏûÏ¢ÌåµÄ³¤¶È´óÓÚmsgsz³¤¶Èʱ£¬msgrcv²ÉÈ¡µÄ²Ù×÷¡£Èç¹ûÉèÖÃÁ˸ñêÖ¾msgrcvÔÚÕâÖÖÇé¿öÏ»ؽضÏÊý¾Ý²¿·Ö£¬¶ø²»·µ»Ø´íÎ󣬷ñÔò·µ»ØÒ»¸öE2BIG´íÎó¡£
ÏÂÃæÊǹØÓÚÏûÏ¢¶ÓÁжÁдµÄ²âÊÔ´úÂ룺
#include <iostream> #include <cstring> #include <errno.h> #include <unistd.h> #include <fcntl.h> #include <sys/msg.h> using namespace std; #define PATH_NAME "/tmp/anonymQueue" key_t CreateKey(const char *pathName) { int fd; if ((fd = open(PATH_NAME, O_CREAT, 0666)) < 0) { cout<<"open file "<<PATH_NAME<<"failed."; cout<<strerror(errno)<<endl; return -1; } close(fd); return ftok(PATH_NAME, 0); } 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; } if (fork() == 0) { char msg[] = "cute yuki..."; char *msgBuf = new char[sizeof(long) + sizeof(msg)]; long mtype = 1; memmove(msgBuf, &mtype, sizeof(mtype)); memmove(msgBuf + sizeof(mtype), msg, sizeof(msg)); for (int i = 1; i <= 5; ++i) { if (msgsnd(msgID, msgBuf, sizeof(msg), 0) < 0) { cout<<"send message "<<i<<"failed..."; cout<<strerror(errno)<<endl; continue; } cout<<"child: send message "<<i<<" success..."<<endl; sleep(1); } exit(0); } char msgBuf[256]; long mtype; int recvLen; for (int i = 1; i <= 5; ++i) { recvLen = msgrcv(msgID, msgBuf, 256 - sizeof(long), 0, 0); if (recvLen < 0) { cout<<"receive message failed..."; cout<<strerror(errno)<<endl; continue; } memmove(&mtype, msgBuf, sizeof(long)); cout<<"parent receive a message:"<<endl; cout<<"message type:"<<mtype<<endl; cout<<"message body:"<<msgBuf + sizeof(long)<<endl; } return 0; } |
ÔÚLinux 2.6.18ϵÄÖ´Ðнá¹ûΪ£º
child: send message 1 success... parent receive a message: message type:1 message body:cute yuki... child: send message 2 success... parent receive a message: message type:1 message body:cute yuki... child: send message 3 success... parent receive a message: message type:1 message body:cute yuki... child: send message 4 success... parent receive a message: message type:1 message body:cute yuki... child: send message 5 success... parent receive a message: message type:1 message body:cute yuki... |
3 System VÏûÏ¢¶ÓÁеĿØÖƲÙ×÷
¶ÔSystem VÏûÏ¢¶ÓÁеÄɾ³ý£¬ÊôÐÔµÄÉèÖúͻñÈ¡µÈ¿ØÖƲÙ×÷ҪʹÓÃÏÂÃæµÄº¯Êý½Ó¿Ú£º
#include <sys/msg.h> ¡¡¡¡int msgctl(int msqid, int cmd, struct msqid_ds *buf); ¡¡¡¡//³É¹¦·µ»Ø0£¬Ê§°Ü·µ»Ø-1 |
msqid£ºÏûÏ¢¶ÓÁеÄÃèÊö·û£»
cmd£º¿ØÖƲÙ×÷µÄÃüÁSUS±ê×¼ÌṩÒÔÏÂÈý¸öÃüÁ
IPC_RMID£¬É¾³ýÒ»¸öÏûÏ¢¶ÓÁС£Ö´ÐиÃÃüÁîϵͳ»áÁ¢¿Ì°Ñ¸ÃÏûÏ¢¶ÓÁдÓÄÚºËÖÐɾ³ý£¬¸ÃÏûÏ¢¶ÓÁÐÖеÄËùÓÐÏûÏ¢½«»á±»¶ªÆú¡£ÕâºÍÒѾÌÖÂÛ¹ýµÄPOSIXÏûÏ¢¶ÓÁÐÓкܴó²î±ð£¬POSIXÏûÏ¢¶ÓÁÐͨ¹ýµ÷ÓÃmq_unlinkÀ´´ÓÄÚºËÖÐɾ³ýÒ»¸öÏûÏ¢¶ÓÁУ¬µ«ÏûÏ¢¶ÓÁеÄÕæÕýÎö¹¹»áÔÚ×îºóÒ»¸ömq_close½áÊøºó·¢Éú¡£
IPC_SET£¬¸ù¾ÝbufµÄËùÖ¸µÄÖµÀ´ÉèÖÃÏûÏ¢¶ÓÁÐmsqid_ds½á¹¹ÖеÄmsg_perm.uid£¬msg_perm.gid£¬msg_perm.mode£¬msg_qbytesËĸö³ÉÔ±¡£
IPC_STAT£¬Í¨¹ýbuf·µ»Øµ±Ç°ÏûÏ¢¶ÓÁеÄmsqid_ds½á¹¹¡£
ÔÚLinuxÏ»¹ÓÐÀýÈçIPC_INFO£¬MSG_INFOµÈÃüÁ¾ßÌå¿ÉÒԲο¼LinuxÊֲ᣻
buf£ºÖ¸Ïòmsqid_ds½á¹¹µÄÖ¸Õ룻
ÏÂÃæÊDzâÊÔ´úÂ룺
#include <iostream> #include <cstring> #include <errno.h> #include <unistd.h> #include <fcntl.h> #include <sys/msg.h> using namespace std; #define PATH_NAME "/tmp/anonymQueue" key_t CreateKey(const char *pathName) { int fd; if ((fd = open(PATH_NAME, O_CREAT, 0666)) < 0) { cout<<"open file "<<PATH_NAME<<"failed."; cout<<strerror(errno)<<endl; return -1; } close(fd); return ftok(PATH_NAME, 0); } 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; return 0; } |
ÔÚ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 |
|