Ò»¡¢ÏûÏ¢¶ÓÁÐ(message
queue)
ÏûÏ¢¶ÓÁÐÒ²ÊÇSystem V IPC»úÖÆÖ®Ò»¡£
ÏûÏ¢¶ÓÁÐÓëÃüÃû¹ÜµÀÀàËÆ£¬
µ«ÉÙÁË´ò¿ªºÍ¹Ø±Õ¹ÜµÀ·½ÃæµÄ¸´ÔÓÐÔ¡£
µ«Ê¹ÓÃÏûÏ¢¶ÓÁв¢Î´½â¾öÎÒÃÇÔÚʹÓÃÃüÃû¹ÜµÀʱÓöµ½µÄһЩÎÊÌ⣬
Èç¹ÜµÀÂúʱµÄ×èÈûÎÊÌâ¡£
ÏûÏ¢¶ÓÁÐÌṩÁËÒ»ÖÖÔÚÁ½¸ö²»Ïà¹Ø½ø³Ì¼ä´«µÝÊý¾ÝµÄ¼òµ¥ÓÐЧµÄ·½·¨¡£
ÓëÃüÃû¹ÜµÀÏà±È£¬
ÏûÏ¢¶ÓÁеÄÓÅÊÆÔÚÓÚ£¬Ëü¶ÀÁ¢ÓÚ·¢ËͺͽÓÊÕ½ø³Ì¶ø´æÔÚ£¬
ÕâÏû³ýÁËÔÚͬ²½ÃüÃû¹ÜµÀµÄ´ò¿ªºÍ¹Ø±Õʱ¿ÉÄܲúÉúµÄһЩÀ§ÄÑ¡£
ÏûÏ¢¶ÓÁÐÌṩÁËÒ»ÖÖ´ÓÒ»¸ö½ø³ÌÏòÁíÒ»¸ö½ø³Ì·¢ËÍÒ»¸öÊý¾Ý¿éµÄ·½·¨¡£
¶øÇÒ£¬Ã¿¸öÊý¾Ý¿é±»ÈÏΪº¬ÓÐÒ»¸öÀàÐÍ£¬
½ÓÊÕ½ø³Ì¿ÉÒÔ¶ÀÁ¢µØ½ÓÊÕº¬Óв»Í¬ÀàÐÍÖµµÄÊý¾Ý¿é¡£
ºÃÏûÏ¢ÊÇ£¬
A. ÎÒÃÇ¿ÉÒÔͨ¹ý·¢ËÍÏûÏ¢À´¼¸ºõÍêÈ«±ÜÃâÃüÃû¹ÜµÀµÄͬ²½ºÍ×èÈûÎÊÌâ¡£
¶øÇÒ£¬
B. ÎÒÃÇ¿ÉÒÔÓÃһЩ·½·¨À´Ìáǰ²é¿´½ô¼±ÏûÏ¢¡£
»µÏûÏ¢ÊÇ£¬
A. Óë¹ÜµÀÒ»Ñù£¬Ã¿¸öÊý¾Ý¿éÓÐÒ»¸ö×î´ó³¤¶ÈµÄÏÞÖÆ£¬
¶øÇÒ£¬
B. ϵͳÖÐËùÓжÓÁÐËù°üº¬µÄÈ«²¿Êý¾Ý¿éµÄ×ܳ¤¶ÈÒ²ÓÐÒ»¸öÉÏÏÞ¡£
LinuxϵͳÖÐÓÐÁ½¸öºê¶¨Òå:
MSGMAX, ÒÔ×Ö½ÚΪµ¥Î»£¬¶¨ÒåÁËÒ»ÌõÏûÏ¢µÄ×î´ó³¤¶È¡£
MSGMNB, ÒÔ×Ö½ÚΪµ¥Î»£¬¶¨ÒåÁËÒ»¸ö¶ÓÁеÄ×î´ó³¤¶È¡£
¶þ¡¢º¯Êý¶¨Òå
ÏûÏ¢¶ÓÁеĺ¯Êý¶¨ÒåÈçÏÂ:
#include <sys/msg.h>
int msgctl(int msqid, int cmd, struct msqid_ds
*buf);
int msgget(key_t key, int msgflg);
int msgrcv(int msqid, void *msg_ptr, size_t msg_sz,
long int msgtype, int msgflg);
int msgsnd(int msqid, const void *msg_ptr, size_t
msg_sz, int msgflg); |
1. msggetº¯Êý
ÎÒÃÇÓÃmsggetº¯ÊýÀ´´´½¨ºÍ·ÃÎÊÒ»¸öÏûÏ¢¶ÓÁÐ:
int msgget(key_t key, int msgflg); |
²ÎÊý: key : ¼üÖµ£¬ ºÍÆäËûIPC»úÖÆÒ»Ñù£¬ ³ÌÐò±ØÐëÌṩһ¸ö¼üÖµÀ´ÃüÃûij¸öÌØ¶¨µÄÏûÏ¢¶ÓÁС£
ÌØÊâ¼üÖµIPC_PRIVATEÓÃÓÚ´´½¨Ë½ÓжÓÁУ¬
´ÓÀíÂÛÉÏ˵£¬ËüÓ¦¸ÃÖ»Äܱ»µ±Ç°½ø³Ì·ÃÎÊ¡£
msgflag: ÓÉ9¸öȨÏÞ±êÖ¾×é³É¡£
ÓÉIPC_CREAT¶¨ÒåµÄÒ»¸öÌØÊâλ±ØÐëºÍȨÏÞ±êÖ¾°´Î»»ò²ÅÄÜ´´½¨Ò»¸öеÄÏûÏ¢¶ÓÁС£
·µ»ØÖµ:
³É¹¦Ê±£¬·µ»ØÒ»¸öÕýÕûÊý£¬¼´¶ÓÁбêʶ;
ʧ°Üʱ£¬·µ»Ø-1.
2. msgsndº¯Êý
¸Ãº¯ÊýÓÃÀ´°ÑÏûÏ¢Ìí¼Óµ½ÏûÏ¢¶ÓÁÐÖÐ:
int msgsnd(int msqid, const void *msg_ptr, size_t msg_sz, int msgflg); |
ÏûÏ¢µÄ½á¹¹ÊÜÁ½·½ÃæÔ¼Êø:
A. ËüµÄ³¤¶È±ØÐëСÓÚϵͳ¹æ¶¨µÄÉÏÏÞ;
B. Ëü±ØÐëÒÔÒ»¸ö³¤ÕûÐγÉÔ±±äÁ¿¿ªÊ¼,
½ÓÊÕº¯Êý½«ÓÃÕâ¸ö³ÉÔ±±äÁ¿À´È·¶¨ÏûÏ¢µÄÀàÐÍ¡£
µ±Ê¹ÓÃÏûϢʱ£¬×îºÃ°ÑÏûÏ¢½á¹¹¶¨ÒåÈçÏÂ:
struct my_message { long int message_type;
/* The data you wish to transfer */
} |
ÓÉÓÚÏûÏ¢µÄ½ÓÊÕÒªÓõ½message_type, ËùÒÔ²»ÄܺöÂÔËü£¬ ÇÒ±ØÐëÔÚÉùÃ÷×Ô¼ºµÄÊý¾Ý½á¹¹Ê±°üº¬Ëü£¬
²¢ÇÒ½«Ëü³õʼ»¯ÎªÒ»¸öÒÑÖªÖµ¡£
²ÎÊý:
msqid : ÊÇÓÉmsggetº¯Êý·µ»ØµÄÏûÏ¢¶ÓÁбêʶ·û¡£
msg_ptr: Ò»¸öÖ¸Ïò×¼±¸·¢´ïÏûÏ¢µÄÖ¸Õ룬
Õâ¸öÏûÏ¢±ØÐëÒÔÇ°ÃæËµµÄÒÔÒ»¸ö³¤ÕûÐγÉÔ±±äÁ¿¿ªÊ¼¡£
msg_sz : ÊÇmsg_ptrÖ¸ÏòµÄÏûÏ¢µÄ³¤¶È£¬
Õâ¸ö³¤¶È²»ÄܰüÀ¨³¤ÕûÐÎÏûÏ¢ÀàÐͳÉÔ±±äÁ¿µÄ³¤¶È¡£
msgflg : ¿ØÖÆÔÚµ±Ç°ÏûÏ¢¶ÓÁÐÂú»ò¶ÓÁÐÏûÏ¢µ½´ïϵͳ·¶Î§µÄÏÞÖÆÊ±£¬
½«Òª·¢ÉúµÄÊÂÇé¡£
IPC_NOWAIT, º¯Êý½«Á¢¼´·µ»Ø£¬²»·¢ËÍÏûÏ¢²¢ÇÒ·µ»ØÖµÎª-1.
Èç¹ûIPC_NOWAIT±êÖ¾±»Ïû³ý£¬Ôò·¢Ëͽø³Ì½«¹ÒÆð£¬
ÒԵȴý¶ÓÁÐÖÐÌÚ³ö¿ÉÓÿռ䡣
·µ»ØÖµ:
³É¹¦Ê±£¬·µ»Ø0£¬ÏûÏ¢Êý¾ÝµÄÒ»·Ý¸±±¾½«±»·Åµ½ÏûÏ¢¶ÓÁÐÖÐ;
ʧ°Üʱ£¬·µ»Ø-1.
3. msgrcvº¯Êý
¸Ãº¯Êý´ÓÒ»¸öÏûÏ¢¶ÓÁÐÖлñÈ¡ÏûÏ¢:
int msgrcv(int msqid, void *msg_ptr, size_t msg_sz, long int msgtype, int msgflg); |
²ÎÊý: msqid : ÓÉmsggetº¯Êý·µ»ØµÄÏûÏ¢¶ÓÁбêʶ·û; msg_ptr: Ò»¸öÖ¸Ïò×¼±¸½ÓÊÕÏûÏ¢µÄÖ¸Õ룬
ºÍÇ°Ãæ½éÉܵÄÒ»Ñù£¬ ÒªÒÔÒ»¸ö³¤ÕûÐγÉÔ±±äÁ¿¿ªÊ¼¡£ msg_sz : ÊÇmsg_ptrÖ¸ÏòµÄÏûÏ¢µÄ³¤¶È£¬
Ëü²»°üÀ¨³¤ÕûÐÎÏûÏ¢³ÉÔ±±äÁ¿µÄ³¤¶È¡£ msgtype: ÊÇÒ»¸ö³¤ÕûÐΣ¬ Ëü¿ÉÒÔʵÏÖÒ»¸ö¼òµ¥ÐÎʽµÄ½ÓÊÕÓÅÏȼ¶¡£
== 0, ½«»ñÈ¡¶ÓÁÐÖеĵÚÒ»¸ö¿ÉÓÃÏûÏ¢; > 0, ½«»ñÈ¡¾ßÓÐÏàͬÏûÏ¢ÀàÐ͵ĵÚÒ»¸öÏûÏ¢;
< 0, ½«»ñÈ¡ÏûÏ¢ÀàÐÍ <= msgtypeµÄ¾ø¶ÔÖµµÄµÚÒ»¸öÏûÏ¢¡£
Èç¹û Ö»Ïë°´ÏûÏ¢·¢Ë͵Ä˳ÐòÀ´½ÓÊÕËüÃÇ£¬
¾Í°ÑmsgtypeÉèÖÃΪ0.
Èç¹û Ö»Ïë»ñÈ¡Ä³Ò»ÌØ¶¨ÀàÐ͵ÄÏûÏ¢£¬
¾Í°ÑmsgtypeÉèÖÃΪÏàÓ¦µÄÀàÐÍÖµ¡£
Èç¹û Ö»Ïë½ÓÊÕÀàÐÍ <= nµÄÏûÏ¢£¬
¾Í°ÑmsgtypeÉèÖÃΪ-n.
msgflg: ÓÃÓÚ¿ØÖƵ±¶ÓÁÐÖÐûÓÐÏàÓ¦ÀàÐ͵ÄÏûÏ¢¿ÉÒÔ½ÓÊÕʱ½«·¢Ë͵ÄÊÂÇé¡£
Èç¹û msgflgÖеÄIPC_NOWAIT±êÖ¾±»ÉèÖã¬
º¯ÊýÁ¢¼´·µ»Ø-1.
Èç¹û msgflgÖеÄIPC_NOWAIT±êÖ¾±»Ïû³ý£¬
½ø³Ì½«»á¹ÒÆðÒԵȴýÒ»ÌõÏàÓ¦ÀàÐ͵ÄÏûÏ¢µ½´ï¡£
·µ»ØÖµ:
³É¹¦Ê±£¬ º¯Êý·µ»Ø·Åµ½½ÓÊÕ»º´æÇøÖеÄ×Ö½ÚÊý£¬
ÏûÏ¢±»¸´ÖƵ½ÓÉmsg_ptrÖ¸ÏòµÄÓû§·ÖÅäµÄ»º´æÖС£
È»ºóɾ³ýÏûÏ¢¶ÓÁÐÖжÔÓ¦µÄÏûÏ¢¡£
ʧ°Üʱ£¬ ·µ»Ø-1.
4. msgctlº¯Êý
¸Ãº¯ÊýÓÃÀ´¿ØÖÆÏûÏ¢¶ÓÁУ¬
int msgctl(int msqid, int cmd, struct msqid_ds *buf); |
msqid_ds½á¹¹ÖÁÉÙ°üº¬ÒÔϳÉÔ±:
struct msqid_ds { uid_t msg_perm.uid; uid_t msg_perm.gid mode_t msg_perm.mode; } |
²ÎÊý: msqid : ÓÉmsgget·µ»ØµÄÏûÏ¢¶ÓÁбêʶ·û¡£ command: ½«Òª²ÉÈ¡µÄ¶¯×÷£¬
Ëü¿ÉÒÔÈ¡3¸öÖµ£¬ IPC_STAT °Ñmsqid_ds½á¹¹ÖеÄÊý¾ÝÉèÖÃΪÏûÏ¢¶ÓÁеĵ±Ç°¹ØÁªÖµ
IPC_SET Èç¹û½ø³ÌÓÐ×ã¹»µÄȨÏÞ£¬ ¾Í°ÑÏûÏ¢¶ÓÁеĵ±×ŹØÁªÖµÉèÖÃΪmsqid_ds½á¹¹Öиø³öµÄÖµ¡£
IPC_RMID ɾ³ýÏûÏ¢¶ÓÁÐ Èç¹ûɾ³ýÏûÏ¢¶ÓÁÐʱ£¬ ij¸ö½ø³ÌÕýÔÚmsgsnd»òmsgrcvº¯ÊýÖеȴý£¬ÕâÁ½¸öº¯Êý½«Ê§°Ü¡£
·µ»ØÖµ:
³É¹¦Ê±£¬·µ»Ø0£¬
ʧ°Üʱ£¬·µ»Ø-1.
Èý¡¢Ê¾Àý
msg1.cÓÃÓÚ½ÓÊÕÏûÏ¢£¬
msg2.cÓÃÓÚ·¢ËÍÏûÏ¢¡£
ÔÊÐíÁ½¸ö³ÌÐò¶¼¿ÉÒÔ´´½¨ÏûÏ¢¶ÓÁУ¬
µ«Ö»ÓнÓÊÕÕßÔÚ½ÓÊÕÍê×îºóÒ»¸öÏûÏ¢ºó¿ÉÒÔɾ³ýËü¡£
1. ½ÓÊÕÕßmsg1.c
#include <stdlib.h> #include <stdio.h> #include <string.h> #include <errno.h> #include <unistd.h>
#include <sys/msg.h>
struct my_msg_st {
long int my_msg_type;
char some_text[BUFSIZ];
};
int main()
{
int running = 1;
int msgid;
struct my_msg_st some_data;
long int msg_to_receive = 0;
|
Ê×ÏÈ´´½¨ÏûÏ¢¶ÓÁÐ:
msgid = msgget((key_t)1234, 0666 | IPC_CREAT);
if (msgid == -1)
{
fprintf(stderr, "msgget failed with error:
%d\n", errno);
exit(EXIT_FAILURE);
} |
msgid = msgget((key_t)1234, 0666 | IPC_CREAT);
if (msgid == -1)
{
fprintf(stderr, "msgget failed with error: %d\n",
errno);
exit(EXIT_FAILURE);
}
È»ºó´Ó¶ÓÁÐÖлñÈ¡ÏûÏ¢£¬Ö±µ½Óö¼ûendÏûϢΪֹ¡£
×îºó£¬É¾³ýÏûÏ¢¶ÓÁÐ:
while(running) { if (msgrcv(msgid, (void *)&some_data, BUFSIZ, msg_to_receive, 0) == -1) { fprintf(stderr, "msgrcv failed with error: %d\n", errno); exit(EXIT_FAILURE); }
printf("You wrote: %s", some_data.some_text);
if (strncmp(some_data.some_text, "end",
3) == 0)
{
running = 0;
}
}
if (msgctl(msgid, IPC_RMID, 0) == -1)
{
fprintf(stderr, ¡°msgctl(IPC_RMID) failed\n¡±);
exit(EXIT_FAILURE);
}
exit(EXIT_SUCCESS);
} |
2. ·¢ËÍÕß³ÌÐòmsg2.c
ͨ¹ýµ÷ÓÃmsgsndÀ´·¢ËÍÓû§ÊäÈëµÄÎı¾µ½ÏûÏ¢¶ÓÁÐÖС£
#include <stdlib.h> #include <stdio.h> #include <string.h> #include <errno.h> #include <unistd.h>
#include <sys/msg.h>
#define MAX_TEXT 512
struct my_msg_st
{
long int my_msg_type;
char some_text[MAX_TEXT];
};
int main()
{
int running = 1;
struct my_msg_st some_data;
int msgid;
char buffer[BUFSIZ];
msgid = msgget((key_t)1234, 0666 | IPC_CREAT);
if (msgid == -1)
{
fprintf(stderr, "msgget failed with error:
%d\n", errno);
exit(EXIT_FAILURE);
}
while(running)
{
printf("Enter some text: ");
fgets(buffer, BUFSIZ, stdin);
some_data.my_msg_type = 1;
strcpy(some_data.some_text, buffer);
if (msgsnd(msgid, (void *)&some_data, MAX_TEXT,
0) == -1)
{
fprintf(stderr, "msgsnd failed\n");
exit(EXIT_FAILURE);
}
if (strncmp(buffer, "end", 3) == 0)
{
running = 0;
}
}
exit(EXIT_SUCCESS);
} |
²»Í¬ÓڹܵÀ£¬
ÕâÀï²»ÐèÒª½ø³Ì×Ô¼ºÀ´Ìṩͬ²½·½·¨¡£
ÕâÊÇËüµÄÓÅÊÆËùÔÚ¡£
¼ÙÈçÏûÏ¢¶ÓÁÐÖÐÓпռ䣬
·¢ËÍÕß¿ÉÒÔ´´½¨¶ÓÁУ¬·ÅһЩÊý¾Ýµ½¶ÓÁÐÖУ¬
È»ºóÔÚ½ÓÊÕÕ߯ô¶¯Ö®Ç°Í˳ö¡£
ÎÒÃǽ«ÏÈÐÐÔËÐз¢ËÍÕßmsg2.
3. ÏÂÃæÊÇһЩÑù±¾Êä³ö:
$ ./msg2 Enter some text: hello Enter some text: How are you today? Enter some text: end $ ./msg1 You wrote: hello You wrote: How are you today? You wrote: end $ |
4. ½âÎö: ·¢ËÍÕß³ÌÐòͨ¹ýmsggetÀ´´´½¨Ò»¸öÏûÏ¢¶ÓÁУ¬ È»ºóÓÃmsgsndÏò¶ÓÁÐÖÐÔö¼ÓÏûÏ¢¡£
½ÓÊÕÕß³ÌÐòÓÃmsgget»ñµÃÏûÏ¢¶ÓÁбêʶ·û£¬ È»ºó¿ªÊ¼½ÓÊÕÏûÏ¢£¬ Ö±µ½½ÓÊÕµ½ÌØÊâÎļþendΪֹ¡£
È»ºóËüÓÃmsgctlÀ´É¾³ýÏûÏ¢¶ÓÁÐÒÔÍê³ÉÇåÀí¹¤×÷¡£ |