¸®´ª½º ÇÁ·Î±×·¡¸Ó¸¦ À§ÇÑ °¡À̵å
³»ºÎ¿Í »ç¿ëÀÚ ÀÚ·á ±¸Á¶ (Internal and User Data Structures)
½Ã½ºÅÛ V IPC¿Í °°ÀÌ º¹ÀâÇÑ ÁÖÁ¦¸¦ ÃæºÐÈ÷ ÀÌÇØÇϱâ À§ÇÑ ¿¼è´Â ÇÑÁ¤µÈ Ä¿³Î ¾È¿¡ Á¸ÀçÇÏ´Â
´Ù¾çÇÑ ³»ºÎ ÀÚ·á ±¸Á¶¿Í Á÷Á¢ÀûÀ¸·Î Ä£ÇØÁö´Â °ÍÀÌ´Ù. ³ª¸ÓÁöµéÀÌ ´õ ³·Àº ´Ü°èÀÌ Á¸ÀçÇÏ°í
ÀÖ´Â ÇÑ, ÀÌ·¯ÇÑ ±¸Á¶¿¡ ´ëÇÑ Á÷Á¢ÀûÀÎ Á¢±ÙÀº °¡Àå ±âº»ÀûÀÎ µ¿ÀÛ¿¡¼ ÇÊ¿äÇÏ´Ù.
¸Þ¼¼Áö ¹öÆÛ (Message buffer)
°¡Àå óÀ½À¸·Î ¸¸³¯ ±¸Á¶´Â msgbuf ±¸Á¶ÀÌ´Ù. ÀÌ Æ¯º°ÇÑ ÀÚ·á ±¸Á¶´Â ¸Þ¼¼Áö ÀڷḦ À§ÇÑ
ÅÛÇø´(template)¶ó »ý°¢ÇÒ ¼ö ÀÖ´Ù. ÇÁ·Î±×·¡¸Ó°¡ ÀÌ·¯ÇÑ Å¸ÀÔÀÇ ±¸Á¶¸¦ Á¤ÀÇÇÏ¿©
»ç¿ëÇÏÁö ¾Ê´Â ÇÑ, msgbuf ŸÀÔÀÇ ±¸Á¶¸¦ ½ÇÁ¦ÀûÀ¸·Î ÀÌÇØÇÏ´Â °ÍÀº ÇʼöÀûÀÌ´Ù.
linux/msg.h¿¡ ´ÙÀ½°ú °°ÀÌ ¼±¾ðµÇ¾î ÀÖ´Ù.:
/* message buffer for msgsnd and msgrcv calls */
/* msgsnd¿Í msgrcv È£ÃâÀ» À§ÇÑ ¸Þ¼¼Áö ¹öÆÛ */
struct msgbuf {
long mtype; /* type of message ¸Þ¼¼Áö ŸÀÔ */
char mtext[1]; /* message text ¸Þ¼¼Áö ³»¿ë */
};
msgbuf ±¸Á¶¿¡´Â µÎ°³ÀÇ ¸â¹ö°¡ ÀÖ´Ù.:
- mtype
¾ç¼ö·Î Ç¥ÇöµÇ´Â ¸Þ¼¼Áö ŸÀÔ. ¹Ýµå½Ã ¾ç¼ö¿©¾ß ÇÑ´Ù.
- mtext
¸Þ¼¼Áö ÀÚ·á ÀÚü.
ÁÖ¾îÁø ¸Þ¼¼Áö¿¡ ŸÀÔÀ» ºÎ¿©ÇÏ´Â ´É·ÂÀº º»ÁúÀûÀ¸·Î ´ÜÀÏ Å¥¿¡¼ÀÇ ´ÙÁß(multiplex)
¸Þ¼¼ÁöµéÀ» ¼ö¿ëÇÒ ´É·ÂÀ» ºÎ¿©ÇÑ´Ù. ¿¹¸¦ µé¸é, Ŭ¶óÀ̾ðÆ® ÇÁ·Î¼¼½ºµéÀº ¸ÅÁ÷¹øÈ£
(magic number)¸¦ ÇÒ´ç¹ÞÀ» ¼ö ÀÖ°í ÀÌ°ÍÀº ¼¹ö ÇÁ·Î¼¼½º·Î ºÎÅÍ º¸³»Áø ¸Þ¼¼Áöµé¿¡ ´ëÇØ
¸Þ¼¼Áö ŸÀÔó·³ »ç¿ëµÉ ¼ö ÀÖ´Ù. ¼¹ö´Â ÀÚüÀûÀ¸·Î ¸î¸îÀÇ ´Ù¸¥ ¹øÈ£¸¦ »ç¿ëÇÒ ¼ö ÀÖ°í,
Ŭ¶óÀ̾ðÆ®´Â ±×¹øÈ£·Î ¸Þ¼¼Áö¸¦ º¸³»±â À§ÇØ »ç¿ëÇÒ ¼ö ÀÖ´Ù. ¶Ç ´Ù¸¥ ½Ã³ª¸®¿À¿¡¼´Â
ÀÀ¿ëÇÁ·Î±×·¥Àº ¿¡·¯ ¸Þ¼¼Áö¿¡ ´ëÇØ ¸Þ¼¼Áö ŸÀÔ '1'¸¦ ¿äû ¸Þ¼¼Áö(request message)¿¡ ´ëÇØ
¸Þ¼¼Áö ŸÀÔ '2'¸¦ Ç¥½ÃÇÒ ¼ö ÀÖ´Ù. ÀÌ·¯ÇÑ °¡´É¼ºÀº ³¡ÀÌ ¾ø´Ù.
¶Ç ´Ù¸¥ ¹æ¹ýÀº ´ë°³ ¸Þ¼¼Áö ÀÚ·á ¿ä¼Ò (mtext)¿¡ ¸Å¿ì ¼¼úÀûÀÎ À̸§À» ºÎ¿©ÇÏ¿© ÇöȤµÇÁö
¾Êµµ·Ï ÇÏ´Â °ÍÀÌ´Ù. ÀÌ Çʵå´Â ²À ¹®ÀÚµéÀÇ ¹è¿ÀÌ¿©¾ß ÇÒ ÇÊ¿ä´Â ¾ø´Ù. ¾î¶² ÇüÅÂÀÇ ¾î¶²
ÀÚ·áÀÌµç »ó°ü¾ø´Ù. ÀÌ ±¸Á¶´Â ÀÀ¿ëÇÁ·Î±×·¥ ÇÁ·Î±×·¡¸Ó¿¡ ÀÇÇØ ÀçÁ¤ÀÇµÉ ¼ö ÀÖÀ¸¹Ç·Î, Çʵå
±× ÀÚü¸¸À¸·Îµµ ½ÇÁ¦·Î ¿ÏÀüÈ÷ ¸¶À½´ë·ÎÀÌ´Ù.
struct my_msgbuf {
long mtype; /* Message type ¸Þ¼¼Áö ŸÀÔ */
long request_id; /* Request identifier ¿äû È®ÀÎÀÚ */
struct client info; /* Client information structure Ŭ¶óÀ̾ðÆ® Á¤º¸ ±¸Á¶ */
};
Àü°ú °°Àº ¸Þ¼¼Áö ŸÀÔÀ» º¼ ¼ö ÀÖÁö¸¸, ±¸Á¶ÀÇ ³ª¸ÓÁö´Â µÎ°³ÀÇ ´Ù¸¥ ¿ä¼Ò·Î ¹Ù²î¾ú´Ù. ±× Áß
Çϳª´Â ¶Ç ´Ù¸¥ ±¸Á¶Ã¼(structure)ÀÌ´Ù! ÀÌ°ÍÀÌ ¸Þ¼¼Áö Å¥ÀÇ ÀåÁ¡ÀÌ´Ù. Ä¿³ÎÀº ÀÚ·á°¡ ¹«¾ùÀ̵ç
ÀÚ·áÀÇ º¯È¯À» ÀÏÀ¸Å°Áö ¾Ê´Â´Ù. ¾î¶² Á¤º¸µçÁö º¸³»Áú ¼ö ÀÖ´Ù.
ÁÖ¾îÁø ¸Þ¼¼ÁöÀÇ ÃÖ´ë Å©±â¿¡ ´ëÇÑ ³»ºÎÀûÀÎ Á¦ÇÑÀº ¾ø´Ù. ¸®´ª½º¿¡¼´Â linux/msg.h¿¡ ´ÙÀ½°ú
°°ÀÌ Á¤ÀǵǾî ÀÖ´Ù.:
#define MSGMAX 4056 /* <= 4056 */ /* max size if message (bytes) ¸Þ¼¼ÁöÀÇ ÃÖ´ë Å©±â */
¸Þ¼¼Áö´Â ±æÀÌ°¡ 4¹ÙÀÌÆ®(long)ÀÎ mtype ¸â¹ö¸¦ Æ÷ÇÔÇÏ¿© ÃÑ Å©±â 4,056¹ÙÀÌÆ®º¸´Ù Ŭ ¼ö ¾ø´Ù.
Ä¿³Î msg ±¸Á¶ (Kernel msg structure)
Ä¿³ÎÀº °¢°¢ÀÇ ¸Þ¼¼Áö¸¦ msg ±¸Á¶Ã¼ÀÇ ¸ð¾ÓÀ¸·Î Å¥¾È¿¡ ÀúÀåÇÑ´Ù. ÀÌ°ÍÀº linux/msg.h¿¡
´ÙÀ½°ú °°ÀÌ Á¤ÀǵǾî ÀÖ´Ù.
/* °¢ ¸Þ¼¼Áö¿¡ ´ëÇÑ ÇÑ°³ÀÇ ¸Þ¼¼Áö ±¸Á¶Ã¼ */
struct msg {
struct msg *msg_next; /* Å¥¿¡¼ÀÇ ´ÙÀ½ ¸Þ¼¼Áö */
long msg_type;
char *msg_spot; /* ¸Þ¼¼Áö ³»¿ë ÁÖ¼Ò */
short msg_ts; /* ¸Þ¼¼Áö ³»¿ë Å©±â */
};
- msg_next
- ÀÌ°ÍÀº Å¥¾È¿¡¼ÀÇ ´ÙÀ½ ¸Þ¼¼Áö¿¡ ´ëÇÑ Æ÷ÀÎÅÍÀÌ´Ù. ÀÌ°ÍÀº Ä¿³ÎÀÇ ÁּҸŰÜÁø °ø°£
(kernel addressing space)¾È¿¡ ÇÑÁÙ·Î ¿¬°áµÈ ¸ñ·Ï(singly linked list)ó·³ ÀúÀåµÇ¾î ÀÖ´Ù.
- msg_type
- ÀÌ°ÍÀº »ç¿ëÀÚ ±¸Á¶Ã¼ÀÎ msgbuf¿¡ ÇÒ´çµÈ ¸Þ¼¼Áö ŸÀÔÀÌ´Ù.
- msg_spot
- ¸Þ¼¼Áö º»Ã¼ÀÇ ½ÃÀÛÁ¡À» °¡¸®Å°´Â Æ÷ÀÎÅÍ
- msg_ts
- ¸Þ¼¼Áö ³»¿ë ¶Ç´Â º»Ã¼ÀÇ ±æÀÌ
Ä¿³Î msqid ds ±¸Á¶ (Kernel msqid ds structure)
IPC °´Ã¼ÀÇ ¼¼°¡Áö ŸÀÔÀÇ °¢°¢Àº Ä¿³Î¿¡ ÀÇÇØ À¯ÁöµÇ´Â ³»ºÎ ÀÚ·á ±¸Á¶¸¦ °¡Áø´Ù.
¸Þ¼¼Áö Å¥¿¡¼´Â msq_id ±¸Á¶ÀÌ´Ù. Ä¿³ÎÀº ½Ã½ºÅÛ »ó¿¡¼ »ý¼ºµÇ´Â ¸ðµç ¸Þ¼¼Áö Å¥¿¡ ´ëÇØ
ÀÌ·¯ÇÑ ±¸Á¶¸¦ Çϳª¾¿ ¸¸µé¾î ÀúÀåÇÏ°í °ü¸®ÇÑ´Ù. linux/msg.h¿¡ ´ÙÀ½°ú °°ÀÌ Á¤ÀǵǾî ÀÖ´Ù.:
/* ½Ã½ºÅÛ»ó¿¡¼ °¢ Å¥¿¡ ´ëÇÑ msqid ±¸Á¶ */
struct msqid_ds {
struct ipc_perm msg_perm;
struct msg *msg_first; /* first message on queue Å¥ÀÇ Ã³À½ ¸Þ¼¼Áö*/
struct msg *msg_last; /* last message in queue Å¥ÀÇ ¸¶Áö¸· ¸Þ¼¼Áö*/
time_t msg_stime; /* last msgsnd time ¸¶Áö¸·À¸·Î msgsnd°¡ ¼öÇàµÈ ½Ã°£*/
time_t msg_rtime; /* last msgrcv time ¸¶Áö¸·À¸·Î msgrcv°¡ ¼öÇàµÈ ½Ã°£*/
time_t msg_ctime; /* last change time ¸¶Áö¸·À¸·Î change°¡ ¼öÇàµÈ ½Ã°£*/
struct wait_queue *wwait;
struct wait_queue *rwait;
ushort msg_cbytes;
ushort msg_qnum;
ushort msg_qbytes; /* max number of bytes on queue Å¥ÀÇ ÃÖ´ë ¹ÙÀÌÆ® ¼ö*/
ushort msg_lspid; /* pid of last msgsnd ¸¶Áö¸·À¸·Î msgsnd¸¦ ¼öÇàÇÑ pid*/
ushort msg_lrpid; /* last receive pid ¸¶Áö¸·À¸·Î ¹ÞÀº pid*/
};
ÀÌ ±¸Á¶Ã¼ÀÇ ´ëºÎºÐÀÇ ¸â¹öµé¿¡ ´ëÇØ °ü½ÉÀ» °®´Â ÀÏÀº °ÅÀÇ ¾øÁö¸¸, ¿ì¸®µéÀÇ ¿©ÇàÀ»
¿Ï¼º½ÃÅ°±â À§ÇØ °¢°¢¿¡ ´ëÇØ °£´ÜÈ÷ ¼³¸íÇÏ°Ú´Ù.
- msg_perm
- ipc_perm ±¸Á¶Ã¼ÀÇ Çϳª·Î linux/ipc.h¿¡ Á¤ÀǵǾî ÀÖ´Ù.
ÀÌ°ÍÀº Á¢±Ù Çã°¡»çÇ×(access permissions)°ú Å¥ÀÇ »ý¼ºÀÚ(creator)¿¡ ´ëÇÑ Á¤º¸(uid, etc)¸¦
Æ÷ÇÔÇÏ´Â ¸Þ¼¼Áö Å¥ÀÇ Çã°¡»çÇ× Á¤º¸¸¦ °¡Áö°í ÀÖ´Ù.
- msg_first
- Å¥ÀÇ Ã¹¹ø° ¸Þ¼¼Áö¿Í ¿¬°áµÇ¾î ÀÖ´Ù.(the head of the list)
- msg_last
- Å¥ÀÇ ¸¶Áö¸· ¸Þ¼¼Áö¿Í ¿¬°áµÇ¾î ÀÖ´Ù.(the tail of the list)
- msg_stime
- Å¥¿¡ º¸³»Áø ¸¶Áö¸· ¸Þ¼¼ÁöÀÇ ½Ã°£ ±â·Ï(Timestamp)
- msg_rtime
- Å¥·Î ºÎÅÍ Á¶È¸µÈ ¸¶Áö¸· ¸Þ¼¼ÁöÀÇ ½Ã°£ ±â·Ï(Timestamp)
- msg_ctime
- Å¥¿¡¼ ÀÏ¾î³ ¸¶Áö¸· º¯È(change)ÀÇ ½Ã°£ ±â·Ï(Timestamp) (more on this later)
- wwait
- and
- rwait
- Ä¿³ÎÀÇ ´ë±â Å¥(wait queue)¸¦ °¡¸®Å°´Â Æ÷ÀÎÅÍ. ¸Þ¼¼Áö Å¥¿¡ ÀÖ´Â µ¿ÀÛÀÌ ÇÁ·Î¼¼½º°¡
sleep »óÅ·Πµé¾î°¡´Â °ÍÀ¸·Î °£ÁÖÇÒ ¶§ »ç¿ëµÈ´Ù. (i.e. Å¥°¡ °¡µæÂ÷¼ ÇÁ·Î¼¼½º°¡
¿¸®±â(opening)¸¦ ±â´Ù¸®°í ÀÖ´Â °æ¿ì)
- msg_qnum
- ÇöÀç Å¥¿¡ µé¾î ÀÖ´Â ¸Þ¼¼ÁöÀÇ °¹¼ö
- msg_qbytes
- Å¥ »óÀÇ ÃÖ´ë ¹ÙÀÌÆ® ¼ö
- msg_lspid
- ¸¶Áö¸· ¸Þ¼¼Áö¸¦ º¸³½ ÇÁ·Î¼¼½ºÀÇ PID
- msg_lrpid
- ¸¶Áö¸· ¸Þ¼¼Áö¸¦ Á¶È¸ÇÑ ÇÁ·Î¼¼½ºÀÇ PID
Ä¿³Î ipc perm ±¸Á¶ (Kernel ipc perm structure)
Ä¿³ÎÀº ipc_perm ŸÀÔÀÇ ±¸Á¶Ã¼ ¾È¿¡ IPC °´Ã¼ÀÇ Çã°¡»çÇ×(permission) Á¤º¸¸¦ ÀúÀåÇÑ´Ù.
¿¹¸¦ µé¸é, ¾Õ¿¡¼ ¼³¸íÇÑ ¸Þ¼¼Áö Å¥ÀÇ ³»ºÎ ±¸Á¶¿¡¼´Â msg_perm ¸â¹ö°¡ ÀÌ·± ŸÀÔÀÌ´Ù.
linux/ipc.h ¾È¿¡ ´ÙÀ½°ú °°ÀÌ ¼±¾ðµÇ¾î ÀÖ´Ù.:
struct ipc_perm
{
key_t key;
ushort uid; /* owner euid and egid */
ushort gid;
ushort cuid; /* creator euid and egid */
ushort cgid;
ushort mode; /* access modes see mode flags below */
ushort seq; /* slot usage sequence number */
};
À§ÀÇ ³»¿ëµîÀº ¸ðµÎ ¸í¹éÈ÷ ÀÚ±â Çؼ®ÀûÀÌ´Ù. °´Ã¼ÀÇ IPC Å°¸¦ °¡Áö°í ÀúÀåµÇ¾î ÀÖ´Â °ÍÀº
±× °´Ã¼ÀÇ »ý¼ºÀÚ(creator)¿Í ÁÖÀÎ(owner)¿¡ ´ëÇÑ Á¤º¸ÀÌ´Ù. (creator¿Í owner´Â ¼·Î ´Ù¸¦ ¼ö ÀÖÀ½)
8Áø Á¢±Ù ¸ðµå(the octal access mode) ¶ÇÇÑ usigned shortÇüÅ·Π¿©±â¿¡ ÀúÀåµÇ¾î ÀÖ´Ù.
¸¶Áö¸·À¸·Î slot usage sequence ¹øÈ£°¡ ³¡¿¡ ÀúÀåµÇ¾î ÀÖ´Ù. ¸Å¹ø IPC °´Ã¼´Â ½Ã½ºÅÛ È£Ãâ
(destroyed)À» °æÀ¯ÇÏ¿© ´ÝÈù´Ù. ÀÌ °ªÀº ½Ã½ºÅÛ ¾È¿¡ Á¸ÀçÇÒ ¼ö ÀÖ´Â IPC °´Ã¼ÀÇ ÃÖ´ë¼ö¿¡ ÀÇÇØ
Áõ°¡µÈ´Ù. ÀÌ °ª¿¡ ´ëÇØ ¿ì¸®°¡ °ü½ÉÀ» °¡Á®¾ß Çϴ°¡? ¾Æ´Ï´Ù.
NOTE:Richard StevensÀÇ UNIX Network Programming 125ÂÊ¿¡ ÀÌ ÁÖÁ¦¿¡ ´ëÇÑ
ÀÚ¼¼ÇÑ ³»¿ë°ú ÀÌ°ÍÀÇ Á¸Àç¿Í µ¿ÀÛÀÇ º¸¾È ÀÌÀ¯µîÀÌ Àß ¼³¸íµÇ¾î ÀÖ´Ù.
ÀÌÀü:±âº» °³³ä (Basic Concepts)
´ÙÀ½:½Ã½ºÅÛ È£Ãâ:msgget() (SYSTEM CALL:msgget())
Copyright (c) 1996,1997 by Euibeom.Hwang & SangEun.Oh All Rights Reserved
Email To:Webmaster ,
Another address
LAST UPDATE Nov 18,1997
Created Nov 17,1997