Äú¿ÉÒÔ¾èÖú£¬Ö§³ÖÎÒÃǵĹ«ÒæÊÂÒµ¡£

1Ôª 10Ôª 50Ôª





ÈÏÖ¤Â룺  ÑéÖ¤Âë,¿´²»Çå³þ?Çëµã»÷Ë¢ÐÂÑéÖ¤Âë ±ØÌî



  ÇóÖª ÎÄÕ ÎÄ¿â Lib ÊÓÆµ iPerson ¿Î³Ì ÈÏÖ¤ ×Éѯ ¹¤¾ß ½²×ù Modeler   Code  
»áÔ±   
 
   
 
 
     
   
 ¶©ÔÄ
  ¾èÖú
linux½ø³Ì¼äµÄͨÐÅ(C): ÏûÏ¢¶ÓÁÐ
 
À´Ô´£ºChinaunix ·¢²¼ÓÚ 2016-7-15
  4441  次浏览      29
 

Ò»¡¢ÏûÏ¢¶ÓÁÐ(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À´É¾³ýÏûÏ¢¶ÓÁÐÒÔÍê³ÉÇåÀí¹¤×÷¡£

   
4441 ´Îä¯ÀÀ       29
 
Ïà¹ØÎÄÕÂ

ÔÆ¼ÆËãµÄ¼Ü¹¹
¶ÔÔÆ¼ÆËã·þÎñÄ£ÐÍ
ÔÆ¼ÆËãºËÐļ¼ÊõÆÊÎö
Á˽âÔÆ¼ÆËãµÄ©¶´
 
Ïà¹ØÎĵµ

ÔÆ¼ÆËã¼ò½é
ÔÆ¼ÆËã¼ò½éÓëÔÆ°²È«
ÏÂÒ»´úÍøÂç¼ÆËã--ÔÆ¼ÆËã
ÈídzÎöÔÆ¼ÆËã
 
Ïà¹Ø¿Î³Ì

ÔÆ¼ÆËãÔ­ÀíÓëÓ¦ÓÃ
ÔÆ¼ÆËãÓ¦ÓÃÓ뿪·¢
CMMIÌåϵÓëʵ¼ù
»ùÓÚCMMI±ê×¼µÄÈí¼þÖÊÁ¿±£Ö¤
×îл¼Æ»®
DeepSeek´óÄ£ÐÍÓ¦Óÿª·¢ 6-12[ÏÃÃÅ]
È˹¤ÖÇÄÜ.»úÆ÷ѧϰTensorFlow 6-22[Ö±²¥]
»ùÓÚ UML ºÍEA½øÐзÖÎöÉè¼Æ 6-30[±±¾©]
ǶÈëʽÈí¼þ¼Ü¹¹-¸ß¼¶Êµ¼ù 7-9[±±¾©]
Óû§ÌåÑé¡¢Ò×ÓÃÐÔ²âÊÔÓëÆÀ¹À 7-25[Î÷°²]
ͼÊý¾Ý¿âÓë֪ʶͼÆ× 8-23[±±¾©]

ר¼ÒÊӽǿ´ITÓë¼Ü¹¹
Èí¼þ¼Ü¹¹Éè¼Æ
ÃæÏò·þÎñÌåϵ¼Ü¹¹ºÍÒµÎñ×é¼þµÄ˼¿¼
ÈËÈËÍøÒÆ¶¯¿ª·¢¼Ü¹¹
¼Ü¹¹¸¯»¯Ö®ÃÕ
̸ƽ̨¼´·þÎñPaaS
Ïà¹ØÅàѵ¿Î³Ì

ÔÆ¼ÆËãÔ­ÀíÓëÓ¦ÓÃ
Windows Azure ÔÆ¼ÆËãÓ¦ÓÃ

ĦÍÐÂÞÀ­ ÔÆÆ½Ì¨µÄ¹¹½¨ÓëÓ¦ÓÃ
ͨÓù«Ë¾GE DockerÔ­ÀíÓëʵ¼ù
ijÑз¢ÖÐÐÄ Openstackʵ¼ù
ÖªÃûµç×Ó¹«Ë¾ ÔÆÆ½Ì¨¼Ü¹¹ÓëÓ¦ÓÃ
ijµçÁ¦ÐÐÒµ »ùÓÚÔÆÆ½Ì¨¹¹½¨ÔÆ·þÎñ
ÔÆ¼ÆËãÓëWindows AzureÅàѵ
±±¾© ÔÆ¼ÆËãÔ­ÀíÓëÓ¦ÓÃ