Subject : IPC °³³äÀº ?
Description :
< ÇÁ·Î¼¼½º°£ Åë½Å >
o °³ ¿ä
- Àü»ê¸Á ÇÁ·Î±×·¥Àº µÑ ¶Ç´Â ±× ÀÌ»óÀÇ ÇÁ·Î¼¼½ºµé »çÀÌ¿¡¼ ÀϾ´Â »óÈ£ ÀÛ¿ëÀ» Æ÷ÇÔÇϹǷÎ,
Åë½ÅÀ» ÇϰíÀÚ ÇÏ´Â ¼·Î ´Ù¸¥ ÇÁ·Î¼¼½ºµéÀÌ »ç¿ë°¡´ÉÇÑ ¿©·¯ °¡Áö ¹æ¹ýµé¿¡ ´ëÇÏ¿© Á¶½É½º·´°Ô »ìÆì
º¸¾Æ¾ß ÇÑ´Ù. ±âÁ¸ÀÇ ´ÜÀÏ ÇÁ·Î¼¼½º ÇÁ·Î±×·¥¿¡¼´Â ÇÑ ÇÁ·Î¼¼½º ³»¿¡ ¿©·¯ ´ÜÆíµéÀÌ Àü¿ª º¯¼ö³ª
ÇÔ¼ö È£Ãâ, ±×¸®°í ÀÌ ÇÔ¼ö¿Í ±× È£ÃâÀÚ »çÀÌ¿¡¼ ÁÖ°í ¹Þ´Â µ¶¸³ º¯¼ö¿Í ÇÔ¼öÀÇ °á°ú¸¦ ÀÌ¿ëÇÏ¿©
¼·Î Åë½ÅÇÒ ¼ö ÀÖ´Ù. ±×·¯³ª °¢ ÇÁ·Î¼¼½º°¡ °íÀ¯ÇÑ ÀÚ½ÅÀÇ ÁÖ¼Ò ¿µ¿ª³»¿¡¼ ½ÇÇàµÇ´Â , ¼·Î µ¶¸³µÇ¾î
ÀÖ´Â ÇÁ·Î¼¼½ºµéÀ» ´Ù·ç°íÀÚ ÇÒ ¶§¿¡´Â Á»´Ù ÀÚ¼¼È÷ °í·ÁÇØ¾ß ÇÒ °ÍµéÀÌ´Ù.
¾à 20¿©³âÀü, ½ÃºÐÇÒ-´ÙÁß ÇÁ·Î±×·¥ ¿î¿µ üÁ¦°¡ °³¹ßµÇ¾úÀ» ¶§ ±× ¼³°è ¸ñÀû ÁßÀÇ Çϳª´Â µ¶¸³µÈ
ÇÁ·Î¼¼½ºµéÀÌ ¼·Î °£¼·ÇÏÁö ¾ÊÀ½À» º¸ÀåÇØ ÁÖ´Â °ÍÀ̾ú´Ù.
µÎ ÇÁ·Î¼¼½º°¡ ¼·Î Åë½ÅÇϱâ À§Çؼ´Â, ¾çÀÚ°¡ ¸ðµÎ ÀÌ Åë½Å¿¡ µ¿ÀÇÇØ¾ß Çϰí, ¶Ç ¿î¿µ üÁ¦°¡
ÇÁ·Î¼¼½º°£ Åë½Å(Interprocess Communication,IPC)À» À§ÇÑ ÆíÀǸ¦ Á¦°øÇØ¾ß ÇÑ´Ù.
page 85 ±×¸² ÂüÁ¶
¿©±â¼ IPCÀÇ ¿©·¯ °¡Áö ¹æ¹ýµéÀ» »ìÆìº¸±â·Î ÇÑ´Ù.
. ÆÄÀÌÇÁ(pipes)
. FIFOs(Áö¸í ÆÄÀÌÇÁ:named pipes)
. ¼Ò½Ä´ë·Õ(message queues)
. Â÷´Ü Ç¥½Ã±â(semaphores)
. °øÀ¯±â¾ïÀå¼Ò(shared memory)
o Àá±Ý°ú ·¹ÄÚµå ÈÀÏ
- ´Ù¼öÀÇ ÇÁ·Î¼¼½º°¡ ƯÁ¤ ÀÚ¿øÀ» °øÀ¯ÇϰíÀÚ ÇÒ °æ¿ì°¡ ÀÖ´Ù. À̶§ ¾î´À ÇѼø°£¿¡´Â ÇÑ ÇÁ·Î¼¼½º¸¸ÀÌ
±× ÀÚ¿øÀ» »ç¿ëÇÒ ¼ö ÀÖµµ·Ï, ±× ÀÚ¿ø »ç¿ë¿¡ ÀÖ¾î ¾î¶² ÇüÅÂÀÇ »óÈ£ ¹èÁ¦°¡ ÇʼöÀûÀ¸·Î Á¦°øµÇ¾î¾ß ÇÑ´Ù.
´ÙÀ½°ú °°Àº ÇÁ·Î±×·¥À» »ý°¢Çغ¸ÀÚ
. ÀϷùøÈ£ ÈÀÏÀ» Àд´Ù.
. ±× ¹øÈ£¸¦ »ç¿ëÇÑ´Ù.
. ¼ýÀÚ¸¦ Áõ°¡½ÃŰ°í ±×°ÍÀ» ´Ù½Ã ±â·ÏÇÑ´Ù.
ÇÑ ÇÁ·Î¼¼½º°¡ ÀÌ ¼¼´Ü°è¸¦ ½ÇÇàÇϰí ÀÖ´Â µ¿¾È ÀϾ ¼ö ÀÖ´Â ¹®Á¦Á¡Àº ¶Ç ´Ù¸¥ ÇÁ·Î¼¼½º°¡ °°Àº ¼¼ ´Ü°è¸¦
¼öÇàÇÒ ¼öµµ ÀÖ´Ù´Â °ÍÀÌ´Ù. °á±¹ È¥¶õÀÌ µÇ´Âµ¥ , µû¶ó¼ ÇÑ ÇÁ·Î¼¼½º°¡ ÀÏÀ» ¸ðµÎ ³¡³¾ ¶§±îÁö
´Ù¸¥ ¾î¶² ÇÁ·Î¼¼½ºµµ ±× ÈÀÏ¿¡ Á¢±ÙÇÒ ¼ö ¾øµµ·Ï Àá±ÝÀ» ¼³Á¤ÇÏ´Â °ÍÀÌ ÇÊ¿äÇÏ´Ù.
´ÙÀ½Àº À§ÀÇ ¼¼ ´Ü°è¸¦ ¼öÇàÇÏ´Â °£´ÜÇÑ ÇÁ·Î±×·¥ÀÌ´Ù.
ÇÔ¼ö my_lock my_unlockÀº ½ÃÀÛÇÒ ¶§ ÈÀÏÀ» Àá±×°í ÀÏ·Ã ¹øÈ£¿Í °ü°èµÈ ÀÛ¾÷ÀÌ ³¡³ª¸é ÈÀÏÀÇ Àá±ÝÀ»
Ç®±âÀ§ÇØ È£ÃâÇÑ´Ù.
#include
#define SEQFILE "ljs"
#define MAXBUFF 100
main()
{
int fd,i,n,pid,seqno;
char buff[MAXBUFF+1];
pid=getpid();
if ( (fd =open(SEQFILE,2))<0)
printf("can't open %s\n",SEQFILE);
for (i=0;i<20;i++) {
my_lock(fd);
lseek(fd,0L,0); /* rewind before read */
if ( (n=read(fd,buff,MAXBUFF)) <=0)
printf("read error\n");
buff[n]='\0';
if ( (n=sscanf(buff,"%d\n",&seqno)) != 1)
printf("sscanf error");
printf("pid=%d, seq#=%d\n",pid,seqno);
seqno++;
sprintf(buff,"%03d\n",seqno);
n=strlen(buff);
lseek(fd,0L,0);
if (write(fd,buff,n)!=n)
printf("write error");
my_unlock(fd);
}
}
my_lock(fd)
int fd;
{
return;
}
my_unlock(fd)
int fd;
{
return;
}
À§ÀÇ my_lock¿Í my_unlockÀº ÀüÇô Àá±ÝÀ» Á¦°øÇÏÁö ¾Ê´Â´Ù.
o ÈÀÏ Àá±Ý°ú ·¹ÄÚµå Àá±Ý
- ÈÀÏ Àá±ÝÀº ÈÀÏ Àüü¸¦ Àá±×´Âµ¥ ºñÇÏ¿© ·¹ÄÚµå Àá±ÝÀº ÇÁ·Î¼¼½º·Î ÇÏ¿©±Ý ÇÑ ÈÀÏÀÇ Æ¯Á¤ ºÎºÐÀ»
Àá±Û ¼ö ÀÖµµ·Ï ÇÑ´Ù. À¯´Ð½º ·¹ÄÚµå Àá±Ý¿¡¼ »ç¿ëÇÏ´Â ·¹ÄÚµå´Â ÈÀϳ»¿¡¼ ½ÃÀÛ ¹ÙÀÌÆ® À§Ä¡¿Í
±× ÁöÁ¡À¸·ÎºÎÅÍÀÇ ¹ÙÀÌÆ® ¼ö¸¦ ÁöÁ¤ÇÔÀ¸·Î½á Á¤ÀÇÇÑ´Ù.
·¹ÄÚµå Àá±ÝÀ̶ó´Â ¿ë¾î´Â ´Ù¸¥ ¿î¿µ üÁ¦¿¡¼ µð½ºÅ© ÈÀÏÀ» ·¹ÄÚµå ÀÚ·á ±¸Á¶·Î
±¸¼ºÇϴµ¥¿¡¼ À¯·¡µÇ¾ú´Ù.
À¯´Ð½º ¾Ë¸ÍÀ̰¡ ·¹ÄÚµåÀÇ °³³äÀ» Á¦°øÇÏÁö ¾ÊÀ¸¹Ç·Î À¯´Ð½ºÀÇ Æ¯Â¡À» °í·ÁÇÑ´Ù¸é ¿µ¿ª Àá±Ý(range locking)
À̶ó´Â ¿ë¾î°¡ ´õ ÁÁÀ» °ÍÀÌ´Ù.
Áï Àá±ÝÀÇ ´ë»óÀÌ ÈÀÏÀÇ ¿µ¿ªÀÌ µÇ´Â °ÍÀÌ´Ù. ÀÌ ¿µ¿ªÀÌ ·¹ÄÚµå¿Í ¾î¶² À¯»ç¼ºÀ»
°®´ÂÁö ¿©ºÎ´Â ÀÀ¿ë ÇÁ·Î±×·¥¿¡ ´Þ·Á ÀÖ´Ù.
System V¿¡¼ lockf ÇÔ¼ö´Â ´ÙÀ½°ú °°´Ù.
#include
int lockf(int fd, int function, long size);
¿©±â¼ functionÀº ´ÙÀ½ °ªÁßÀÇ Çϳª¸¦ °®´Â´Ù.
F_ULOCK Àü¿¡ Àá±Ù ¿µ¿ªÀ» Àá±Ý ÇØÁ¦ÇÑ´Ù.
F_LOCK ÇÑ ¿µ¿ªÀ» Àá±Ù´Ù(ºÀ¼â)
F_TLOCK ÇÑ ¿µ¿ªÀ» °Ë»çÇϰí Àá±Ù´Ù(ºñºÀ¼â)
F_TEST ÇÑ ¿µ¿ªÀÇ Àá±Ý ¿©ºÎ¸¦ °Ë»çÇÑ´Ù..
lockf ÇÔ¼ö´Â ÇöÀç ÈÀÏÀÇ À§Ä¡¿Í "·¹ÄÚµå"¸¦ Á¤ÀÇÇϱâ À§ÇÑ sizeµ¶¸³ º¯¼ö¸¦ »ç¿ëÇÑ´Ù.
·¹ÄÚµå´Â ÇöÀçÀÇ À§Ä¡¿¡¼ ½ÃÀÛÇÏ¿© ¾ç¼öÀÇ size¸¸Å ¾ÕÂÊÀ¸·Î È®ÀåµÇ°Å³ª À½¼öÀÇ size ¸¸Å µÞÂÊÀ¸·Î
È®ÀåµÈ´Ù.
size°¡ 0ÀÎ °æ¿ì ¿µÇâÀ» ¹Þ´Â ·¹ÄÚµå´Â ÇöÀçÀÇ À§Ä¡·ÎºÎÅÍ °¡Àå Å« ÈÀÏ À§Ä¡(ÈÀÏÀÇ ³¡)±îÁö È®ÀåµÈ´Ù.
ÈÀÏÀÇ ½ÃÀÛÁ¡À¸·Î lseekÀ» ÇàÇÑÈÄ size0ÀÇ lockf¸¦ ¼öÇàÇϸé Àüü ÈÀÏÀÌ Àá±ä´Ù.
lockf ÇÔ¼ö´Â Àá±ÝÀ» ¼³Á¤ÇÏ´Â ±â´É°ú Àá±Ý ¼³Á¤ ¿©ºÎ¸¦ °Ë»çÇÏ´Â ±â´É µÎ°¡Áö¸¦ ¸ðµÎ Á¦°øÇÑ´Ù.
function°ªÀÌ F_LOCKÀÌ°í ±× ¿µ¿ªÀÌ ÀÌ¹Ì ´Ù¸¥ ÇÁ·Î¼¼½º¿¡ ÀÇÇØ Àá°ÜÁ® ÀÖÀ¸¸é , È£Ãâ ÇÁ·Î¼¼½º´Â
±× ¿µ¿ªÀÌ »ç¿ë °¡´ÉÇØÁú ¶§±îÁö ´ë±â »óŰ¡ µÈ´Ù. À̸¦ ºÀ¼â¶ó ÇÑ´Ù.
±×·¯³ª F_TLOCK¿¬»êÀº ºñºÀ¼â¶ó ĪÇϴµ¥ - ¸¸¾à ±× ¿µ¿ªÀÌ »ç¿ë°¡´ÉÇÏÁö ¾ÊÀº °æ¿ì, lockfÇÔ¼ö´Â
Áï½Ã -1ÀÇ °ªÀ¸·Î º¹±ÍÇϰí errnoÀ» EAGAIN ¶Ç´Â EACCES·Î ¸¸µç´Ù.
¶ÇÇÑ F_TEST¿¬»êÀº ÇÁ·Î¼¼½º·Î ÇÏ¿©±Ý Àá±Ý¼³Á¤ ¾øÀÌ Àá±Ý ¿©ºÎ¸¸À» °Ë»çÇÒ ¼ö ÀÖµµ·Ï ÇØÁØ´Ù.
ºñºÀ¼â Àá±ÝÀ» Çϱâ À§Çؼ´Â F_TLOCK¿¬»êÀ» »ç¿ëÇØ¾ß¸¸ ÇÑ´Ù.
´ÙÀ½°ú °°Àº °æ¿ì¸¦ »ý°¢ÇØ º¸ÀÚ.
if (lockf(fd, F_TEST, size) ==0) {
rc = lockf(fd, F_LOCK, size);
...
}
À§Àǰæ¿ì, F_TEST¿Í F_LOCK»çÀÌ¿¡¼ ´Ù¸¥ ÇÁ·Î¼¼½º°¡ lockf ÇÔ¼ö¸¦ È£ÃâÇϸé F_LOCKÀ» ºÀ¼âÇÏ´Â
°æ¿ì°¡ »ý±æ ¼ö ÀÖ´Ù. F_TLOCKÀº ÀÌ °æ¿ì¿¡ ÇÊ¿äÇÑ ´ÜÀÏ ÀÛ¾÷ ¹æ½ÄÀ¸·Î Àá±ÝÀ» ½ÃÇèÇÏ°í ¼³Á¤ÇÒ ¼ö
ÀÖµµ·Ï ÇØÁØ´Ù.
ºñºÀ¼â Àá±ÝÀÇ ÇÑ ¿¹·Î, ¸¸¾à ¾î´À ÆÄ¼ö²Û ÇÁ·Î±×·¥ÀÌ ½ÃÀÛÇÏ°í ¼öÇàÁßÀÎ ÆÄ¼ö²ÛÀÌ ¿ÀÁ÷ ÇϳªÀ̱⸦
¿øÇÏ´Â °æ¿ì¸¦ »ý°¢ÇØ º¸ÀÚ.
ÆÄ¼ö²Û ÇÁ·Î±×·¥ÀÌ ½ÃÀ۵Ǹé, ƯÁ¤ ÈÀÏ¿¡ ºñºÀ¼â Àá±ÝÀ» ½ÇÇàÇÑ´Ù.
Àá±ÝÀÌ ¼º°øÀûÀ¸·Î ¼öÇàµÇ¸é, ÆÄ¼ö²Û ÇÁ·Î±×·¥Àº ¿ÀÁ÷ Çϳª¸¸ÀÌ ¼öÇàÁßÀÏ °ÍÀ̰í, ½ÇÆÐÇÑ´Ù¸é À̹Ì
±×ÀÇ º¹Á¦°¡ Çϳª ´õ Á¸ÀçÇÑ´Ù´Â °ÍÀ¸·Î ÀνÄÇϰí, ÀÚ½ÅÀº Á¾·áÇÒ ¼ö ÀÖ´Ù.
o BSD ±Ç°í Àá±Ý
- 4.3BSD°¡ Á¦°øÇÏ´Â ±Ç°í ÈÀÏ Àá±ÝÀ» ÀÌ¿ëÇÏ´Â ¾ÕÀÇ ÀÏ·Ã ¹øÈ£ÀÇ ¿¹¸¦ °è¼Ó ¼³¸íÇÑ´Ù.
flock½Ã½ºÅÛ È£ÃâÀº ÇÑ ÈÀÏÀÇ Àá±Ý°ú Àá±Ý ÇØÁ¦¸¦ Á¦°øÇÑ´Ù.
#include
int flock(int fd, int operation);
fd´Â ¿·Á ÀÖ´Â ÈÀÏÀÇ ÈÀÏ ÁöÁ¤ ¹øÈ£À̰í, operationÀº ´ÙÀ½ »ó¼öµé·ÎºÎÅÍ Çü¼ºµÈ´Ù.
LOCK_SH °øÀ¯ Àá±Ý
LOCK_EX »óÈ£ ¹èÁ¦ Àá±Ý
LOCK_UN Àá±Ý ÇØÁ¦
LOCK_NB Àá±Ý¿¡¼ ºÀ¼âÇÏÁö ¾ÊÀ½
Çϳª ÀÌ»óÀÇ °øÀ¯ Àá±ÝÀº ÇÑ ÈÀÏ¿¡ ´ëÇÏ¿© Ç×»ó Àû¿ëÇÒ ¼ö ÀÖ´Ù.
±×·¯³ª ÇϳªÀÇ ÈÀÏ¿¡ ´ëÇØ °øÀ¯Àá±Ý°ú »óÈ£ ¹èÁ¦ Àá±ÝÀ» µ¿½Ã¿¡ Á¦°øÇϰųª ´Ù¼öÀÇ »óÈ£ ¹èÁ¦ Àá±ÝÀ»
Á¦°øÇÏ´Â °ÍÀº ¾î¶² °æ¿ì¿¡µµ ºÒ°¡´ÉÇÏ´Ù. Çã¿ëµÇ´Â Àá±Ý ¿¬»êÀº ¾Æ·¡¿Í °°´Ù.
LOCK_SH °øÀ¯ Àá±Ý(ºÀ¼â)
LOCK_EX »óÈ£ ¹èÁ¦ Àá±Ý(ºÀ¼â)
LOCK_SH | LOCK_NB °øÀ¯ Àá±Ý(ºñºÀ¼â)
LOCK_EX | LOCK_NB »óÈ£ ¹èÁ¦ Àá±Ý(ºñºÀ¼â)
LOCK_UN Àá±Ý ÇØÁ¦
Àá±ÝÀÌ ¼º°øÀûÀ¸·Î ¼öÇàµÇ¸é flockÀÌ 0À» µ¹·ÁÁÖ°í, ±×·¸Áö ¾ÊÀ¸¸é -1À» µ¹·ÁÁØ´Ù.
¸¸¾à ÈÀÏÀÌ ÀÌ¹Ì Àá±â¾î ÀÖ°í, ºñºÀ¼â Àá±ÝÀÌ ¿ä±¸µÇ¾î(LOCK_NB), Àá±Ý¿¡ ½ÇÆÐÇÑ´Ù¸é , Àü¿ª º¯¼ö
errno´Â EWOULDBLOCKÀÌ µÈ´Ù.
¿ì¸®°¡ ´ÙÀ½°ú °°ÀÌ Àá±Ý ÇÔ¼ö¸¦ ¸¸µé¾î¾ß ÇÔÀ» ÀǹÌÇÑ´Ù.
/* Locking routines for 4.3BSD */
#include
my_lock(fd)
int fd;
{
if(flock(fd,LOCK_EX) == -1)
printf("Can't LOCK_EX);
}
my_unlock(fd)
int fd;
{
if(flock(fd,LOCK_UN) == -1)
printf("Can't LOCK_UN);
}
o ´Ü¼øÇÑ °í°´-ÀϲÛÀÇ ¿¹
- ¾Æ·¡±×¸²ÀÇ °í°´-ÀϲÛÀÇ ¿¹´Â IPCÀÇ ´Ù¾çÇÑ ¹æ¹ýµéÀ» ¼³¸íÇϱâ À§ÇÏ¿© ÀÌ Àå Àüü¿¡¼ »ç¿ëÇÑ´Ù.
°í°´Àº Ç¥ÁØÀÔ·ÂÀ¸·ÎºÎÅÍ ÈÀÏ À̸§À» ÀÐ°í ±×°ÍÀ» IPC ä³Î¿¡ ¾´´Ù.
ÀϲÛÀº ÀÌ ÈÀÏÀ̸§À» IPC ä³Î·ÎºÎÅÍ Àаí, ÀÌ ÈÀÏÀ» Àбâ À§ÇØ ÈÀÏÀ» ¿·Á°í ÇÑ´Ù.
ÀϲÛÀÌ ÈÀÏÀ» ¿°ÔµÇ¸é ±× ÈÀÏÀ» ÀÐ¾î¼ ±× ³»¿ëÀ» IPC ä³Î¿¡ ¾¸À¸·Î½á ÀÀ´äÇÏ°Ô µÇ°í, ±×·¸Áö ¸øÇϸé
ÈÀÏÀ» ¿¼ö ¾ø´Ù´Â ASCII·Î µÈ ¿¡·¯ ¼Ò½ÄÀ¸·Î ÀÀ´äÇÏ°Ô µÈ´Ù.
±×·¯¸é , °í°´Àº IPCä³Î·ÎºÎÅÍ Àаí, ÀÚ½ÅÀÌ ÀÐÀº °ÍÀ» Ç¥ÁØ Ãâ·Â¿¡ ¾´´Ù.
ÀϲÛÀÌ ÈÀÏÀ» ÀÐÁö ¸øÇϸé, °í°´Àº IPCä³Î·ÎºÎÅÍ ¿¡·¯ ¼Ò½ÄÀ» Àд´Ù.
±×·¸Áö ¾ÊÀº °æ¿ì ±× ÈÀÏÀÇ ³»¿ëÀ» Àд´Ù.
filename stdin ----------- filename -------------
------> | | ----------------> | | <--- file
| client | file contents | server |
file contents <----- | | <--------------- | |
or error ¸Þ½ÃÁö stdout ----------- or error messages -------------
o ÆÄÀÌÇÁ
- À¯´Ð½º´Â ¿©·¯ Èï¹ÌÀÖ´Â °Íµé°ú ÇÔ²² ÆÄÀÌÇÁ¸¦ Á¦°øÇÑ´Ù. ÇϳªÀÇ ÆÄÀÌÇÁ´Â µ¥ÀÌŸÀÇ ÀϹæ È帧À»
Á¦°øÇÏ¸ç ½Ã½ºÅÛ È£Ãâ pipe¸¦ ÀÌ¿ëÇÏ¿© ¸¸µç´Ù.
int pipe(int *filedes);
µÎ°³ÀÇ ÈÀÏ ÁöÁ¤ ¹øÈ£ -Àб⸦ À§ÇØ ¿¸®´Â filedes[0]¿Í ¾²±â¸¦ À§ÇÑ filedes[1]- ¸¦ µ¹·ÁÁØ´Ù.
ÆÄÀÌÇÁ´Â ÇϳªÀÇ ÇÁ·Î¼¼½º³»¿¡¼´Â Àß »ç¿ëÇÏÁö ¾ÊÁö¸¸, ¿©±â¼´Â ÀÌ ÆÄÀÌÇÁµéÀÌ ¾î¶»°Ô ¸¸µé¾îÁö°í
»ç¿ëµÇ´ÂÁö¸¦ ¼³¸íÇϱâ À§ÇØ °£´ÜÇÑ ¿¹¸¦ µç´Ù.
main()
{
int pipefd[2],n;
char buff[100];
if (pipe(pipefd) <0)
printf("pipe error");
printf("read fd= %d, write fd= %d\n", pipefd[0],pipefd[1]);
if (write(pipefd[1], "hello world\n",12) != 12)
printf("write error");
if ( (n=read(pipefd[0], buff, sizeof(buff))) <= 0) ==> pipefd[0]¿¡¼ sizeof(buff)¸¸Å Àоî¼
printf("read error"); buff¿¡ ÀúÀå
write(1,buff,n); /* fd 1 = stdou */
exit(0);
}
´ÜÀÏ ÇÁ·Î¼¼½º ³»¿¡¼ ÆÄÀÌÇÁ°¡ ¾î¶»°Ô µ¿ÀÛÇÏ´ÂÁö´Â page 99 ±×¸² 3.4¿¡ ÀÖ´Ù. ÇϳªÀÇ ÆÄÀÌÇÁ´Â
Ç×»ó Àû¾îµµ 4096 ¹ÙÀÌÆ®ÀÇ ÇÑÁ¤µÈ Å©±â¸¦ °®´Â´Ù. ÆÄÀÌÇÁ¸¦ ÀÐ°í ¾²±â À§ÇÑ ±ÔÄ¢ - ÆÄÀÌÇÁ ³»¿¡
´õÀÌ»óÀÇ µ¥ÀÌŸ°¡ ¾øÀ» ¶§ ȤÀº ÆÄÀÌÇÁ°¡ °¡µæ ãÀ» ¶§ -Àº FIFO¿¡ °üÇÑ ´ÙÀ½ Àý¿¡¼ ¼³¸íÇÒ °ÍÀÌ´Ù.
¼·Î ´Ù¸¥ µÎ ÇÁ·Î¼¼½º »çÀÌ¿¡¼ Åë½ÅÇϱâ À§ÇØ ÆÄÀÌÇÁ¸¦ »ç¿ëÇÏ´Â ÀüÇüÀûÀÎ ¹æ¹ýÀº ´ÙÀ½°ú °°´Ù.
¿ì¼± ÇÑ ÇÁ·Î¼¼½º°¡ ÆÄÀÌÇÁ¸¦ ¸¸µé°í ±×¸®°í³ª¼ fork¸¦ ÀÌ¿ë, ÀÚ±âÀÚ½ÅÀ» º¹Á¦ÇÑ´Ù.
±×¸®°í ³ª¼ ¾î¹öÀÌ ÇÁ·Î¼¼½º°¡ ÆÄÀÌÇÁ ÀбâÂÊÀ» ´Ý°í, ÀÚ½Ä ÇÁ·Î¼¼½º°¡ ¾²±âÂÊÀ» ´Ý´Â´Ù.
ÀÌ·¸°Ô ÇÏ¿© µÎ ÇÁ·Î¼¼½º »çÀÌ¿¡¼ µ¥ÀÌŸÀÇ ÀϹæ È帧ÀÌ ¸¸µé¾îÁø´Ù.
- À¯´Ð½º ²®µ¥±â¿¡ »ç¿ëÀÚ°¡
who | sort | lpr
ÀÇ ¸í·É¾î¸¦ ÀÔ·ÂÇÏ¸é ²®µ¥±â´Â ¼¼°³ÀÇ ÇÁ·Î¼¼½º¿Í ±×µé »çÀÌ¿¡ µÎ°³ÀÇ ÆÄÀÌÇÁ¸¦ ¸¸µé±â À§Çؼ
À§¿¡¼ ¾ð±ÞÇÑ °ÍÀ» ´Ü°èÀûÀ¸·Î ÇàÇÑ´Ù.
Áö±Ý±îÁö º¸¾Ò´ø ¸ðµç ÆÄÀÌÇÁ´Â ´ÜÀÏ ¹æÇâÀ» °¡Áö¸ç, ¿ÀÁ÷ ÇÑ ¹æÇâÀÇ µ¥ÀÌŸ È帧À» Á¦°øÇÏ´Â °ÍÀ̾ú´Ù.
¾ç¹æÇâÀÇ µ¥ÀÌŸ È帧ÀÌ ÇÊ¿äÇÑ °æ¿ì, µÎ°³ÀÇ ÆÄÀÌÇÁ¸¦ ¸¸µé¾î¼ °¢ ¹æÇâÀÇ Àü¼ÛÀ» À§ÇØ °¢°¢ Çϳª¾¿
»ç¿ëÇÑ´Ù. ½ÇÁ¦·Î À̸¦ ±¸ÇöÇϱâ À§ÇÑ ´Ü°è´Â ´ÙÀ½°ú °°´Ù.
. ÆÄÀÌÇÁ 1À» ¸¸µé°í, ÆÄÀÌÇÁ 2¸¦ ¸¸µç´Ù.
. fork¸¦ ÇÑ´Ù.
. ¾î¹öÀÌ´Â ÆÄÀÌÇÁ1ÀÇ ÀбâÂÊÀ» ´Ý´Â´Ù.
. ¾î¹öÀÌ´Â ÆÄÀÌÇÁ2ÀÇ ¾²±âÂÊÀ» ´Ý´Â´Ù.
. ÀÚ½ÄÀº ÆÄÀÌÇÁ 1ÀÇ ¾²±âÂÊÀ» ´Ý´Â´Ù.
. ÀÚ½ÄÀº ÆÄÀÌÇÁ 2ÀÇ ÀбâÂÊÀ» ´Ý´Â´Ù.
- Ç¥ÁØ ÀÔÃâ·Â ¸ðÀ½Àº ÆÄÀÌÇÁ¸¦ ¸¸µé°í ±× ÆÄÀÌÇÁ·ÎºÎÅÍ Àаųª ±× ÆÄÀÌÇÁ¿¡ ¾²´Â ´Ù¸¥ ÇÁ·Î¼¼½º¸¦
ÃʱâÈÇØ ÁÖ´Â ±â´ÉÀ» Á¦°øÇÑ´Ù.
#include
FILE *popen(char *command, char *type);
command´Â ²®µ¥±â ¸í·É¾î ÁÙÀÌ´Ù. À̰ÍÀº Bourne Shell¿¡¼ ±¸µ¿µÇ¸ç, PATH ȯ°æº¯¼ö¸¦ command¸¦ ã´Âµ¥
»ç¿ëÇÑ´Ù. È£Ãâ ÇÁ·Î¼¼½º¿Í ÁöÁ¤µÈ ¸í·É¾î »çÀÌ¿¡ ÆÄÀÌÇÁ°¡ Çϳª ¸¸µé¾îÁø´Ù.
popen¿¡¼ µ¹¾Æ¿À´Â °ªÀº ¹®ÀÚ¿ type¿¡ µû¶ó ÀÔ·Â ¶Ç´Â Ãâ·Â¿¡ »ç¿ëµÇ´Â Ç¥ÁØ ÀÔÃâ·Â FILE Áö½ÃÀÚ°¡
µÈ´Ù. ÀÌ typeÀÇ °ªÀÌ rÀ̸é È£Ãâ ÇÁ·Î¼¼½º´Â commandÀÇ Ç¥ÁØ Ãâ·ÂÀ» Àаí w À̸é È£Ãâ ÇÁ·Î¼¼½º´Â
±× ¸í·É¾îÀÇ Ç¥ÁØÀԷ¿¡ ¾´´Ù. popen ½Ã½ºÅÛ È£ÃâÀÌ ½ÇÆÐÇϸé NULL°ªÀÌ µ¹¾Æ¿Â´Ù.
¾Æ·¡ÀÇ ÇÔ¼ö´Â
#include
int pclose(FILE *stream);
popen¿¡ ÀÇÇØ ¸¸µé¾îÁø ÀÔÃâ·Â ¿¬¼Ó ó¸®(stream)¸¦ ´Ý°í, commandÀÇ exit »óŸ¦ µ¹·ÁÁØ´Ù.
¸¸¾à ÀÌ popen¿¡ ÀÇÇØ ¿¬¼Ó 󸮰¡ ¸¸µé¾îÁöÁö ¾Ê¾Ò´Ù¸é -1ÀÌ º¹±ÍµÇ´Ù.
#include
#define MAXLINE 10
main()
{
int n;
char line[MAXLINE], command[MAXLINE+10];
FILE *fp;
if (fgets(line,MAXLINE,stdin) == NULL) ---> MAXLINEÀº ÀÐÇôÁú Å©±â¸¦ Á¦ÇÑ,lineÀº ÀúÀåÀå¼Ò
printf("filename read error");
sprintf(command, "cat %s", line); ---> line¿¡´Â cat´ÙÀ½¿¡ ¿À´Â ÀÎÀÚ°¡ ÀúÀåµÈ´Ù
if ( (fp=popen(command,"r")) ==NULL)
printf("popen error");
while ((fgets(line,MAXLINE,fp)) != NULL) {
n = strlen(line);
if (write(1,line,n) != n) ---> 1Àº fd·Î¼ Ç¥ÁØÃâ·ÂÀ» ÀǹÌÇÔ
printf("data write error");
}
if (ferror(fp))
printf("fgets error");
pclose(fp);
exit(0);
}
# a.out
Á¤¸®
Çϸé cat Á¤¸®°¡ ½ÇÇàÀÌ µÈ´Ù.
popenÇÔ¼ö´Â ¶Ç ´Ù¸¥ ¿ëµµ·Î ,ÇÁ·Î¼¼½ºÀÇ ÇöÀç ÀÛ¾÷ ÈÀÏ ¸íºÎ¸¦ ¾Ë¾Æ³»´Âµ¥ »ç¿ëÇÒ ¼ö ÀÖ´Ù.
½Ã½ºÅÛ È£Ãâ chdirÀÌ ÇÁ·Î¼¼½ºÀÇ Çö ÀÛ¾÷ ÈÀÏ ¸íºÎ¸¦ º¯È½Ãų ¼ö ÀÖÀ½À» »ó±âÇϰí, ÇÑÆíÀ¸·Î
ÇöÀçÀÇ °ªÀ» ¾òÀ» ¼ö ÀÖ´Â ½Ã½ºÅÛ È£ÃâÀº ¾ø´Ù´Â °Í¿¡ À¯ÀÇÇÏÀÚ.
System V¿¡¼´Â getcwdÇÔ¼ö·Î ÀÌ ÀÛ¾÷À» ÇÒ ¼ö ÀÖ°í, 4.3BSD¿¡¼´Â getwd°¡ ºñ½ÁÇÑ ÀÛ¾÷À» ÇØ ÁÖÁö¸¸
¶È°°Áö´Â ¾Ê´Ù.
´ÙÀ½Àº À¯´Ð½ºÀÇ pwd ¸í·É¾î¸¦ »ç¿ëÇÏ¿© ÇöÀçÀÇ ÀÛ¾÷ ÈÀÏ ¸íºÎ¸¦ ¾Ë¾Æ³»°í,
±×°ÍÀ» ÀμâÇÏ´Â ÇÁ·Î±×·¥ÀÌ´Ù.
#include
#define MAXLINE 255
main()
{
FILE *fp;
char line[MAXLINE];
if ( (fp=popen("/bin/pwd","r"))==NULL)
printf("popen error");
if (fgets(line,MAXLINE,fp) == NULL) --> ¿©±â¼ lineÀº pwdÀÇ ½ÇÇà°á°ú°¡ ÀúÀåµÊ
printf("fgets error");
printf("%s",line);
pclose(fp);
exit(0);
}
ÆÄÀÌÇÁÀÇ »ç¿ë¿¡ ÀÖ¾î °¡Àå Å« ´ÜÁ¡Àº °°Àº ¾î¹öÀÌ ÇÁ·Î¼¼½º¸¦ °¡Áø ÇÁ·Î¼¼½ºµé »çÀÌ¿¡¼¸¸ ÆÄÀÌÇÁ¸¦
»ç¿ëÇÒ ¼ö ÀÖ´Ù´Â °ÍÀÌ´Ù. ÆÄÀÌÇÁ°¡ ÇÑ ÇÁ·Î¼¼½º¿¡¼, ½Ã½ºÅÛ È£Ãâ fork·Î ¸¸µé¾îÁø ´Ù¸¥
ÇÁ·Î¼¼½ºµé¿¡°Ô¸¸ Àü´ÞÀÌ µÇ±â¶§¹®À̸ç, ¾î¹öÀÌ ÇÁ·Î¼¼½º¿Í ½Ã½ºÅÛ È£Ãâ forkÈÄ¿¡ ¸¸µé¾îÁø
ÀÚ½ÄÇÁ·Î¼¼½ºµé »çÀÌ¿¡¼¸¸ ¿¸° ÈÀÏÀÌ °øÀ¯µÇ±â ¶§¹®ÀÌ´Ù.
ÀüÇô °ü°è°¡ ¾ø´Â µÎ ÇÁ·Î¼¼½º¸¦ ´ë»óÀ¸·Î ±× »çÀÌ¿¡ ÆÄÀÌÇÁ¸¦ ¸¸µé°í ±×°ÍÀ» IPC¸¦ À§ÇØ
»ç¿ëÇÒ ¼ö ÀÖ´Â ¹æ¹ýÀº ¾ø´Ù.
o FIFOs
- FIFO´Â First In First Out. Áï ¸ÕÀú µé¾î¿Â °ÍÀÌ ¸ÕÀú ³ª°£´Ù´Â ¶æÀÇ ¿µ¹® ¾àÀÚÀÌ´Ù.
À¯´Ð½º FIFO´Â ÆÄÀÌÇÁ¿Í ºñ½ÁÇѵ¥ , µ¥ÀÌŸÀÇ ÀϹæ È帧À» Á¦°øÇϰí, ±×°÷ FIFO¿¡ ù¹øÂ° ¾²ÀÎ ¹ÙÀÌÆ®°¡
±×°ÍÀ¸·ÎºÎÅÍ ÀÐ¾î ³¾¼ö Àִ ù¹øÂ° ¹ÙÀÌÆ®ÀÌ´Ù.
±×·¯³ª ÆÄÀÌÇÁ¿Í´Â ´Þ¸® FIFO´Â ±×°Í ÀÚü¿¡ À̸§ÀÌ ºÙ¾î ÀÖ¾î ¼·Î ¹«°üÇÑ ÇÁ·Î¼¼½ºµéÀÌ ÇϳªÀÇ
FIFO¸¦ »ç¿ëÇÒ ¼ö ÀÖµµ·Ï ÇØÁØ´Ù.
µû¶ó¼ Áö¸í ÆÄÀÌÇÁ(named pipe)¶ó°í ºÎ¸£±âµµ ÇÑ´Ù.
FIFO´Â System V¿¡¼ Á¦°øÇϰí, 4.3BSD¿¡¼´Â Á¦°øÇÏÁö ¾Ê´Â´Ù.
o ¿¬¼Óó¸®¿Í ¼Ò½Ä(Streams and Messages)
- Áö±Ý±îÁö º¸¾Æ¿Ô´ø ÆÄÀÌÇÁ¿Í FIFOµéÀÇ ¿¹´Â À¯´Ð½º¿¡ ÀûÇÕÇÑ ¿¬¼Ó ó¸® ÀÔÃâ·Â ¸ðµ¨À» »ç¿ëÇϰí ÀÖ´Ù.
¿©±â¿¡´Â ·¹ÄÚµåÀÇ °æ°è°¡ ¾øÀ¸¸ç, µû¶ó¼ Àбâ¿Í ¾²±â °úÁ¤¿¡¼ µ¥ÀÌŸ¸¦ °Ë»çÇÒ Çʿ䰡 ¾ø´Ù.
¿¹¸¦ µé¾î ÆÄÀÌÇÁ·ÎºÎÅÍ 100¹ÙÀÌÆ®¸¦ Àд ÇÁ·Î¼¼½º´Â ±× ÆÄÀÌÇÁ¿¡ µ¥ÀÌŸ¸¦ Àû¾ú´ø ÇÁ·Î¼¼½º°¡ Çѹø¿¡
100 ¹ÙÀÌÆ®¸¦ Àû¾ú´ÂÁö, ¾Æ´Ï¸é 20 ¹ÙÀÌÆ®¾¿ ´Ù¼¸¹øÀ» ½è´ÂÁö, ȤÀº 50¹ÙÀÌÆ®¾¿ µÎ¹øÀ» ½è´Â Áö
¾Ë¼ö ¾ø´Ù. ¶ÇÇÑ ÇÑ ÇÁ·Î¼¼½º°¡ ÆÄÀÌÇÁ¿¡ 55 ¹ÙÀÌÆ®¸¦ Àû°í ´Ù¸¥ ÇÁ·Î¼¼½º°¡ 45¹ÙÀÌÆ®¸¦ ¾´ °æ¿ìµµ
ÀÖÀ» ¼ö ÀÖ´Ù. ¿©±â¿¡¼ µ¥ÀÌŸ´Â ½Ã½ºÅÛ¿¡ ÀÇÇØ ¾Æ¹«·± ÇØ¼®ÀÌ °¡ÇØÁöÁö ¾Ê´Â ´Ü¼øÇÑ ¹ÙÀÌÆ®ÀÇ ¿¬¼ÓÀÏ
»ÓÀÌ´Ù. ¸¸¾à ¾î¶² ÇØ¼®ÀÌ ¿ä±¸µÈ´Ù¸é, ¾²±â ÇÁ·Î¼¼½º¿Í Àбâ ÇÁ·Î¼¼½º´Â ±× ÇØ¼®¿¡ µ¿ÀÇÇØ¾ß Çϰí, ÀÚ±â
ÀÚ±â ÀڽŵéÀÌ ¾Ë¾Æ¼ ÇØ¾ß ÇÑ´Ù.
±×·¯³ª ÇÁ·Î¼¼½º°¡ Àü´ÞÇÏ´Â µ¥ÀÌŸ¿¡ ¾î¶² ±¸Á¶¸¦ ºÎ¿©ÇϰíÀÚ ÇÒ ¶§°¡ ÀÖ´Ù.
µ¥ÀÌŸ°¡ °¡º¯ ±æÀÌÀÇ ¼Ò½ÄÀ¸·Î ÀÌ·ç¾îÁø °æ¿ì°¡ ´ëÇ¥ÀûÀÎ ¿¹·Î, ÀÌ °æ¿ì ÀдÂÀÚ·Î ÇÏ¿©±Ý, ¼Ò½ÄÀÇ °æ°è°¡
¾î´À °÷ÀÎÁö¸¦ ¾Ë°Ô ÇÏ¿© ÇϳªÀÇ ´ÜÀ§ ¼Ò½Ä¸¸À» ÀÐ¾î °¡µµ·Ï ÇØ¾ß ÇÒ Çʿ䰡 ÀÖ´Ù.
IPC ±â´ÉÀ» ¹ÙÅÁÀ¸·Î ÇÑ ¿¬¼Ó ó¸® À§¿¡ ¼Ò½Ä ±¸Á¶¸¦ ºÎ¿©ÇÒ Çʿ䰡 ÀÖ´Â ¸¹Àº À¯´Ð½º ÇÁ·Î¼¼½ºµéÀº °¢
¼Ò½ÄÀ» ºÐ¸®Çϱâ À§ÇØ ÁÙ¹Ù²Þ ¹®ÀÚ(newline character)¸¦ »ç¿ëÇϰí ÀÖ´Ù.
¾²±â ÇÁ·Î¼¼½º´Â °¢ ¼Ò½Ä¿¡ ÁÙ¹Ù²Þ ¹®ÀÚ¸¦ ÷°¡Çϰí Àбâ ÇÁ·Î¼¼½º´Â IPCÀÇ Ã¤³Î·ÎºÎÅÍ Çѹø¿¡ ÇÑ ÁÙ¾¿
ÀÐ¾î ¿Â´Ù.
¶ÇÇÑ ÆÄÀÌÇÁ³ª FIFOÀÇ Àб⠾²±â¸¦ À§ÇØ Ç¥ÁØ ÀÔÃâ·Â ¸ðÀ½À» »ç¿ëÇÒ ¼ö ÀÖ´Ù.
ÆÄÀÌÇÁ¸¦ ¿±â À§Çؼ´Â ½Ã½ºÅÛ È£Ãâ pipe¸¦ »ç¿ëÇÏ´Â ¹æ¹ý»ÓÀ̰í, À̶§ ÈÀÏ ÁöÁ¤ ¹øÈ£°¡ µé¾Æ¿À¹Ç·Î
Ç¥ÁØ ÀÔÃâ·ÂÇÔ¼ö fdopenÀº ¹Ýµå½Ã Ç¥ÁØ ÀÔÃâ·Â ¿¬¼Ó ó¸®¿Í ¿¸° ÈÀÏ ÁöÁ¤¹øÈ£¿Í °áºÎ½ÃÄÑ
»ç¿ëÇÏ¿©¾ß¸¸ ÇÑ´Ù.
FIFO´Â À̸§À» ÀÚÁö¹Ç·Î Ç¥ÁØ ÀÔÃâ·Â fopenÀ» »ç¿ëÇÏ¿© ¿ ¼ö ÀÖ´Ù.
o À̸§ ¿µ¿ª (Name Spaces)
- ÆÄÀÌÇÁ´Â À̸§À» °®°í ÀÖÁö ¾ÊÁö¸¸ ,FIFO´Â ÀÚ½ÅÀ» ½Äº°ÇÒ ¼ö ÀÖµµ·Ï À¯´Ð½º °æ·Î¸íÀ» °®´Â´Ù.
´ÙÀ½Àý¿¡¼ IPCÀÇ ´Ù¸¥ ÇüŸ¦ ´Ù·ê ¶§´Â, Ãß°¡·Î À̸§À» ºÙÀÌ´Â ¿©·¯°¡Áö °ü·Ê¸¦ »ç¿ëÇÑ´Ù.
IPCÀÇ ÁÖ¾îÁø ÇüÅ¿¡ ´ëÇØ »ç¿ë°¡´ÉÇÑ À̸§ÀÇ ÁýÇÕÀ» À̸§ ¿µ¿ªÀ̶ó ÇÑ´Ù.
ÆòÀÌÇÑ ÆÄÀÌÇÁ°¡ ¾Æ´Ñ IPCÀÇ ¸ðµç ÇüÅ¿¡¼ ¼Ò½ÄÀ» "±³È¯"Çϱâ À§ÇØ ¾î¶»°Ô °í°´°ú ÀϲÛÀÌ ¿¬°áµÇ´Â Áö¸¦
À̸§ÀÌ ±ÔÁ¤ÇϹǷΠÀ̸§ ¿µ¿ªÀº Áß¿äÇÏ´Ù.
ÀÌ Àå¿¡¼ ¿ì¸®°¡ ´Ù·ê ½Ã½ºÅÛÀÇ ÇÁ·Î¼¼½º»çÀÌ¿¡ ´ëÇÑ IPC¹æ¹ýÀ» ±â¼úÇÒ ¶§´Â »ç¿ë °¡´ÉÇÑ À̸§ ¿µ¿ª¿¡¼
À̸§À» ¼±ÅÃÇÏ´Â °ÍÀÌ Áß¿äÇØ Áø´Ù.
´ÙÀ½Àº IPCÀÇ ¿©·¯ °¡Áö ÇüÅ¿¡¼ »ç¿ëÇÏ´Â À̸§ÀÇ °ü·Ê¸¦ ¿ä¾àÇÑ °ÍÀÌ´Ù. ¸¶Áö¸· ¿Àº ÇÁ·Î¼¼½º°¡ ¾î¶»°Ô
ƯÁ¤ ÇüÅÂÀÇ IPC¿¡ Á¢±ÙÇϴ°¡¸¦ ±ÔÁ¤Çϰí ÀÖ´Ù.
IPC¸¦ À§ÇÑ À̸§ °ø°£
--------------------------------------------------------------------
| IPC type | Name space | Identification |
--------------------------------------------------------------------
| pipe | (no name) | file descriptor |
| FIFO | pathname | file descriptor |
| message queue | key_t key | identifier |
| shared memory | key_t key | identifier |
| semaphore | key_t key | identifier |
| socket-Unix domain | pathname | file descriptor |
| socket-other domains |(domain dependent) | file descriptor |
--------------------------------------------------------------------
o key_t ¿¼è(keys)
- System V Ç¥ÁØ C¸ðµë¿¡¼ Á¦°øÇÏ´Â ÇÔ¼ö ftokÀº °æ·Î¸í°ú °úÁ¦ ½Äº°ÀÚ¸¦ System V IPC¿¼è·Î ¹Ù²Ù¾î ÁØ´Ù.
(¾î¶² ÀÌÀ¯ÀÎÁö´Â ¸ð¸£Áö¸¸, ÀÌ ÇÔ¼ö´Â ½ÇÁ¦ ÀÚ½ÅÀÇ À̸§º¸´Ù´Â stdipc¶ó´Â À̸§À¸·Î System VÀÇ »ç¿ë
¼³¸í¼¿¡ Ç¥½ÃµÇ¾î ÀÖ´Ù) ÀÌ System V IPC¿¼èµéÀº ´ÙÀ½ Àýµé¿¡¼ ¼³¸íÇÒ ¼Ò½Ä ´ë·Õ, °øÀ¯±â¾ï Àå¼Ò
±×¸®°í Â÷´Ü Ç¥½Ã±â¸¦ ½Äº°Çϴµ¥¿¡ »ç¿ëÇÑ´Ù.
#include
#include
key_t ftok(char *pathname, char proj);
ÈÀÏ ¿¡¼ ÀüÇüÀûÀÎ 32ºñÆ®ÀÇ Á¤¼öÇüÀÎ key_tÀÇ µ¥ÀÌŸÇüÀ» Á¤ÀÇÇϰí ÀÖ´Ù.
IPC ÀÀ¿ë ÇÁ·Î±×·¥¿¡¼ Àϲ۰ú °í°´Àº ¸ðµÎ ±× ÀÀ¿ë ÇÁ·Î±×·¥¿¡ Ưº°ÇÑ Àǹ̸¦ Áö´Ï´Â ´ÜÀÏ °æ·Î¸í¿¡
ÀÏÄ¡ÇØ¾ß ÇÑ´Ù. ±× °æ·Î¸íÀº ÀÏ²Û ÆÄ¼ö²ÛÀÇ °æ·Î¸íÀϼöµµ ÀÖ°í, ÀϲÛÀÌ »ç¿ëÇÏ´Â ÀÏ¹Ý µ¥ÀÌŸÈÀÏÀÇ
°æ·Î¸í ¶Ç´Â ½Ã½ºÅÛ ³»ÀÇ ¾î¶² °æ·Î¸íÀϼöµµ ÀÖ´Ù.
¸¸¾à °í°´°ú ÀϲÛÀÌ ±×µé »çÀÌ¿¡ ÇϳªÀÇ IPC ä³Î¸¸À» »ç¿ëÇÑ´Ù¸é, proj=1À» »ç¿ëÇÒ ¼ö ÀÖ´Ù.
´Ù¼öÀÇ IPCä³ÎÀÌ ÇÊ¿äÇϸé, ¿¹¸¦ µé¾î °í°´À¸·ÎºÎÅÍ ÀϲÛÀ¸·Î °¡´Â ä³Î Çϳª¿Í ÀϲÛÀ¸·ÎºÎÅÍ °í°´À¸·Î °¡´Â
´Ù¸¥ ÇϳªÀÇ Ã¤³ÎÀÌ ÇÊ¿äÇÑ °æ¿ì, ÇÑ Ã¤³ÎÀº proj=1, ´Ù¸¥ ä³ÎÀº proj=2¸¦ »ç¿ëÇÒ ¼ö ÀÖ´Ù.
Çѹø pathname°ú proj°¡ °í°´°ú Àϲۿ¡ ÀÇÇØ ÀÏÄ¡µÇ¸é À̵éÀº °°Àº IPC ¿¼è·Î º¯È¯Çϱâ À§ÇØ ÇÔ¼ö
ftokÀ» È£ÃâÇÒ ¼ö ÀÖ´Ù.
pathnameÀÌ Á¸ÀçÇÏÁö ¾Ê°Å³ª, È£Ãâ ÇÁ·Î¼¼½º°¡ ±× pathname¿¡ Á¢±ÙÇÒ ¼ö ¾øÀ» ¶§, ftokÀº -1À» µ¹·Á ÁØ´Ù.
ÀÚ½ÅÀÇ pathnameÀÌ ¿¼è¸¦ ¸¸µå´Âµ¥ »ç¿ëµÈ ÈÀÏÀº Á¸ÀçÇÏ´Â µ¿¾È¿¡´Â Àϲۿ¡ ÀÇÇØ¼ ¸¸µé¾îÁö°Å³ª
Á¦°ÅµÉ ¼ö ¾ø´Âµ¥, ÀÌ´Â ÈÀÏÀÌ ¸¸µé¾îÁú¶§¸¶´Ù »õ·Î¿î i-node¹øÈ£¸¦ °¡Á¤ÇϹǷΠ´ÙÀ½ È£ÃâÀÚ¿¡°Ô
ftokÀÌ µ¹·Á ÁÖ´Â ¿¼è°¡ ´Ù¸¦ ¼ö Àֱ⠶§¹®ÀÌ´Ù.
ftok¿¡ ´ëÇÑ µ¶¸³ º¯¼ö proj´Â 8ºñÆ®ÀÇ ¹®ÀÚÀÌÁö, ¹®ÀÚ¿¿¡ ´ëÇÑ Áö½ÃÀÚ°¡ ¾Æ´ÔÀ» ¸í½ÉÇ϶ó.
ÀϹÝÀûÀ¸·Î ÇÔ¼ö ftokÀº ´ÙÀ½°ú °°ÀÌ ±¸ÇöÇÑ´Ù. ÇÔ¼ö ftokÀº 8ºñÆ®ÀÇ proj°ªÀ» ÁöÁ¤µÈ pathname¿¡
ÇØ´çÇÏ´Â µð½ºÅ© ÈÀÏÀÇ i-node¹øÈ£ °ª°ú µð½ºÅ© ÈÀÏÀÌ À§Ä¡ÇÏ´Â ÈÀÏ ½Ã½ºÅÛÀÇ ºÎ±â±â ¹øÈ£¸¦ Á¶ÇÕÇÑ´Ù.
ÀÌ ¼¼ °ªÀÇ Á¶ÇÕÀÌ 32ºñÆ®ÀÇ ¿¼è¸¦ ¸¸µé¾î³»´Â °ÍÀÌ´Ù.
ÈÀÏÀÌ Á¸ÀçÇÏ´Â ÈÀÏ ½Ã½ºÅÛ ³»¿¡¼ÀÇ ÈÀÏÀÇ i-node ¹øÈ£¸¦ (´ÜÀÏ µð½ºÅ© Á¦¾î±âÀÇ µð½ºÅ© ºÐÇÒ¿¡
ÇØ´çÇÏ´Â)ÈÀÏ ½Ã½ºÅÛÀÇ ºÎ±â±â ¹øÈ£¿Í °°ÀÌ »ç¿ëÇϹǷνá ÀÌ ÇÔ¼ö´Â °íÀ¯ÇÑ ¿¼è °ªÀ» ¸¸µé¾î³¾·Á°í ÇÑ´Ù.
½Ã½ºÅÛ³»ÀÇ °¡´ÉÇÑ ¸ðµç °æ·Î¸í¿¡ ´ëÇØ °íÀ¯ÇÑ ¿¼è°ªÀ» º¸ÀåÇϱâ À§ÇØ 32ºñÆ®ÀÇ i-node ¹øÈ£¿Í 8ºñÆ®ÀÇ
ÁÖ±â±â ¹øÈ£, ±×¸®°í 8ºñÆ®ÀÇ ºÎ±â±â ¹øÈ£¸¦ Á¶ÇÕÇÒ Çʿ䰡 ÀÖ´Ù.
ftokÀÌ »ç¿ëÇÏ´Â ¾Ë°í¸®ÁòÀº ¼·Î ´Ù¸¥ µÎ °æ·Î¸íÀÌ °°Àº ŰÀÌ °ªÀ» ¸¸µé¾î ³»´Â È®·üÀº 0Àº ¾Æ´ÏÁö¸¸
¸Å¿ì ÀÛÀº ŸÇù¾ÈÀÌ´Ù. ½ÇÁ¦·Î i-node¹øÈ£°¡ 16ºñÆ®º¸´Ù Å« °æ¿ì´Â °ÅÀÇ ¾øÀ¸¹Ç·Î ¼·Î ´Ù¸¥ µÎ °æ·Î¸íÀÌ
°°Àº ¿¼è¸¦ ¸¸µé¾î³¾·Á¸é µÎ ÈÀÏÀÌ °°Àº i-node¹øÈ£¿Í °°Àº ºÎ±â±â ¹øÈ£¸¦ °¡Áö¸é µÇ°í ÁÖ±â±â ¹øÈ£´Â
°ü°è°¡ ¾ø´Ù.
o System V IPC
- ´ÙÀ½ ¼¼°¡Áö ÇüÅÂÀÇ IPC¸¦ ÃÑĪÇÏ¿© "System V IPC"¶ó°í ÇÑ´Ù.
. ¼Ò½Ä ´ë·Õ(message queues)
. Â÷´Ü Ç¥½Ã±â(semaphores)
. °øÀ¯±â¾ï Àå¼Ò(shared memory)
À̵éÀº À̵éÀ» ÀÌ¿ëÇÏ´Â ½Ã½ºÅÛ È£Ãâ °üÁ¡¿¡¼ ¸¹Àº À¯»çÁ¡À» °¡Áö°í ÀÖ°í, ¶Ç ¾Ë¸ÍÀ̰¡ À¯ÁöÇÏ´Â Á¤º¸ÀÇ
°üÁ¡¿¡¼µµ ¸Å¿ì ºñ½ÁÇÏ´Ù. À̵éÀÇ ½Ã½ºÅÛ È£ÃâÀº ´ÙÀ½°ú °°ÀÌ ¿ä¾àÇÒ ¼ö ÀÖ´Ù.
------------------------------------------------------------------------------------------
| | Message queue | Semaphore | Shared memory |
------------------------------------------------------------------------------------------
| include file | | | |
| system call to create or open | msgget | semget | shmget |
| system call for control operations | msgctl | semctl | shmctl |
| system calls for IPC operations | msgsnd | semop | shmat |
| | msgrcv | | shmdt |
------------------------------------------------------------------------------------------
¾Ë¸ÍÀÌ´Â °¢ IPCä³Î¿¡ ´ëÇØ¼µµ ÈÀÏÀ» ´Ù·ç±â À§ÇÑ Á¤º¸¿Í ºñ½ÁÇÑ Á¤º¸ÀÇ ±¸Á¶¸¦ °®´Â´Ù.
struct ipc_perm {
ushort uid; /* owner's user id */
ushort gid; /* owner's group id */
ushort cuid; /* creator's user id */
ushort cgid; /* creator's group id */
ushort mode; /* access modes */
ushort seq; /* slot usage sequence number */
key_t key; /* key */
};
ÀÌ ±¸Á¶´Â System V IPC ½Ã½ºÅÛ È£Ãâ¿¡¼ »ç¿ëÇÏ´Â ¸í¹éÇÑ »ó¼öµé°ú ÇÔ²² ¿¡ Á¤ÀǵǾî ÀÖ´Ù.
ÀÌ ±¸Á¶¸¦ »ç¿ëÇÏ°í ¶Ç º¯°æÇϱâ À§Çؼ´Â ¼¼°¡ÁöÀÇ ctl ½Ã½ºÅÛ È£ÃâÀ» »ç¿ëÇÑ´Ù.
¼¼°³ÀÇ ½Ã½ºÅÛ È£Ãâ getÀº ÇϳªÀÇ IPC ä³ÎÀ» ¸¸µé°Å³ª ¿±âÀ§ÇØ »ç¿ëµÇ¸ç ¸ðµÎ key_tÇüÀÇ ¿¼è °ªÀ»
ÃëÇϰí Á¤¼öÇü ½Äº°ÀÚ¸¦ µÇµ¹·Á ÁØ´Ù. ÀÌÀÇ ´Ü°èº° ¼ø¼´Â ¾Æ·¡¿¡ Ç¥½ÃÇÏ¿´´Ù.
< ftok¸¦ ÀÌ¿ëÇÑ IPC id ¸¦ ¸¸µå´Â °úÁ¤ >
------------ ------------
char *path | ftok() | key_t key | msgget() | int id
-------------> | | ----------> | semget() | --------->
char proj ------------ | shmget() |
------------
ÀÌ ¼¼°³ÀÇ get ½Ã½ºÅÛ È£ÃâÀº ¸ðµÎ°¡ IPCä³Î¿¡ ´ëÇÑ modeÀÇ ÇÏÀ§ ¼ø¼ 9ºñÆ®¸¦ ÁöÁ¤Çϰí, »õ·Î¿î IPC
ä³ÎÀ» ¸¸µéÁö, ¶Ç´Â ÀÌ¹Ì Á¸ÀçÇϴ ä³ÎÀ» ÂüÁ¶ÇÒ °ÍÀÎÁö¸¦ ÁöÁ¤Çϱâ À§ÇØ µ¶¸³ º¯¼ö flag¸¦ ÃëÇÑ´Ù.
»õ·Î¿î IPCä³ÎÀ» ¸¸µéÁö, ¶Ç´Â ÀÌ¹Ì Á¸ÀçÇϴ ä³ÎÀ» ÂüÁ¶Çϰí ÀÖ´ÂÁö¿¡ ´ëÇÑ ±ÔÄ¢Àº ´ÙÀ½°ú °°´Ù.
. IPC_PRIVATEÀÇ ¿¼è °ªÀ» ÁöÁ¤Çϸé, °íÀ¯ÇÑ IPCä³ÎÀÌ ¸¸µé¾îÁüÀÌ º¸ÀåµÈ´Ù.
ftokÀ¸·Î ÇÏ¿©±Ý IPC_PRIVATEÀÇ ¿¼è °ªÀ» ¸¸µé¾î ³»µµ·Ï ÇÒ ¼ö ÀÖ´Â pathname°ú projÀÇ Á¶ÇÕÀº ¾ø´Ù.
. flag³¹¸»ÀÇ IPC_CREATºñÆ®¸¦ 1·Î Çϸé ÁöÁ¤µÈ ¿¼è¿¡ ´ëÇÏ¿© Ç׸ñÀÌ Á¸ÀçÇÏÁö ¾Ê´Â°æ¿ì
»õ·Î¿î Ç׸ñÀ» ¸¸µé¾î ÁØ´Ù. ÀÌ¹Ì Ç׸ñÀÌ Á¸ÀçÇϰí ÀÖ´Ù¸é, ÀÌ Ç׸ñÀº µÇµ¹¾Æ ¿Â´Ù.
. flag³¹¸»ÀÇ IPC_CREAT¿Í IPC_EXCL ºñÆ®¸¦ ¸ðµÎ 1·ÎÇÏ¸é ¸¸µé°íÀÚ ÇÏ´Â Ç׸ñÀÌ Á¸ÀçÇÏÁö ¾Ê´Â °æ¿ì¿¡
ÇÑÇØ ÁöÁ¤µÈ ¿¼è¿¡ ´ëÇÑ »õ·Î¿î Ç׸ñÀ» ¸¸µé¾î ÁØ´Ù. ¸¸¾à, IPCä³ÎÀÌ ÀÌ¹Ì Á¸ÀçÇϰí ÀÖÀ¸¸é
¿¡·¯°¡ ¹ß»ýÇÑ´Ù.
IPC_EXCLºñÆ®´Â È£ÃâÀÚ°¡ IPCä³ÎÀ» ¹èŸÀûÀ¸·Î Á¢±ÙÇϵµ·Ï º¸ÀåÇØÁÖÁö´Â ¾Ê´Â´Ù´Âµ¥¿¡ À¯ÀÇÇØ¾ß ÇÑ´Ù.
À̰ÍÀÇ ±â´ÉÀº »õ·Î¿î IPCä³ÎÀÌ ¸¸µé¾îÁö°Å³ª, ¶Ç´Â ±×·¸Áö ¾ÊÀº °æ¿ì ¿¡·¯°¡ µ¹·ÁÁüÀ» º¸ÀåÇÒ »ÓÀÌ´Ù.
½ÉÁö¾î´Â IPC_CREAT¿Í IPC_EXCL ¸ðµÎ¸¦ ÁöÁ¤ÇÏ°í »õ·Î¿î IPC ä³ÎÀ» ¸¸µå´Â °æ¿ì¿¡µµ ¸¸¾à ´Ù¸¥
»ç¿ëÀÚµéÀÌ ±× ä³ÎÀÇ mode ³¹¸»ÀÇ ÇÏÀ§ 9ºñÆ®¿¡ ÀûÀýÇÑ Çã°¡¸¦ °®°í ÀÖÀ¸¸é, ¿ª½Ã ±× ä³Î¿¡
Á¢±ÙÇÒ ¼ö ÀÖ´Ù.
. IPC_CREATºñÆ®¸¦ 1·Î ÇÏÁö ¾Ê°í IPC_EXCL¸¸À»1·Î ÇÏ´Â °æ¿ì´Â ¾Æ¹«·± Àǹ̰¡ ¾ø´Ù.
< IPC ä³ÎÀ» ¿°Å³ª ¸¸µé ¶§ÀÇ ³í¸® >
--------------------------------------------------------------------------
| flag argument | key Á¸Àç¾ÈÇÒ¶§ | key°¡ ÀÌ¹Ì Á¸ÀçÇÒ¶§ |
--------------------------------------------------------------------------
| no special flags | error,errno=ENOENT | OK |
| IPC_CREAT | OK. creates new entry | OK |
| IPC_CREAT | IPC_EXCL | OK. creates new entry | error, errno=EEXIST |
--------------------------------------------------------------------------
À§¿¡¼ °¡¿îµ¥ ÁÙ¿¡¼ IPC_CREATÇ¥½Ã±â°¡ IPC_EXCL¾øÀÌ »ç¿ëµÇ´Â °æ¿ì, »õ·Î¿î Ç׸ñÀÌ ¸¸µé¾î Á³´ÂÁö ¶Ç´Â
ÇöÀç Á¸ÀçÇϰí ÀÖ´Â Ç׸ñÀ» ÂüÁ¶Çϰí ÀÖ´ÂÁö¸¦ ¾Ë ¼ö ÀÖ´Â ¹æ¹ýÀº ¾ø´Ù´Â °Í¿¡ ÁÖÀÇÇÏÀÚ.
IPC_CREATÇ¥½Ã±â¿Í ÇÔ²² ½Ã½ºÅÛ È£Ãâ getÁß Çϳª¸¦ »ç¿ëÇÏ¿© »õ·Î¿î IPC ä³ÎÀ» ¸¸µé ¶§¸¶´Ù µ¶¸³º¯¼ö
flagÀÇ ÇÏÀ§ 9ºñÆ®´Â ipc_perm±¸Á¶³»ÀÇ mode ³¹¸»À» ÃʱâÈÇÑ´Ù.
ºÎ°¡ÀûÀ¸·Î cuid¿Í cgidºÎºÐµµ È£Ãâ ÇÁ·Î¼¼½ºÀÇ À¯È¿ »ç¿ëÀÚ ID¿Í À¯È¿ Áý´Ü ID¸¦ °¢°¢ °®°Ô µÈ´Ù.
ipc_perm±¸Á¶³»ÀÇ uid¿Í gid¶ÇÇÑ È£Ãâ ÇÁ·Î¼¼½ºÀÇ À¯È¿ »ç¿ëÀÚ ID¿Í À¯È¿ Áý´Ü ID¸¦ °¢°¢ °®°Ô µÈ´Ù.
ÀÌ µÎ°¡Áö ID´Â "¼ÒÀ¯ÀÚ ID(owner ID)"¶ó°í ÇÏ´Â ¹Ý¸é cuid¿Í cgid´Â "»ý¼ºÀÚ ID(creator ID)"¶ó°í
ÇÑ´Ù. ÀÌ »ý¼ºÀÚ ID´Â Àý´ë·Î º¯ÇÏÁö ¾ÊÁö¸¸, ÇÁ·Î¼¼½º°¡ ¼ÒÀ¯ÀÚ ID¸¦ º¯°æÇÏ´Â °ÍÀº IPCÀåÄ¡¿¡
´ëÇÑ ctl½Ã½ºÅÛ È£Ãâ(msgctl, semctl, ¶Ç´Â shmctl)À» È£ÃâÇÔÀ¸·Î½á °¡´ÉÇÏ´Ù.
ÀÌ ¼¼°¡Áö ½Ã½ºÅÛ È£Ãâ ctlÀº ÇÑ ÇÁ·Î¼¼½º°¡ IPC ä³ÎÀÇ mode ³¹¸»ÀÇ ÇÏÀ§ 9ºñÆ®¸¦ ¹Ù²Ù´Â °Í¿¡ Çã¿ëÇÑ´Ù.
¾î¶² ÇÁ·Î¼¼½º°¡ IPCä³ÎÀ» Á¢±ÙÇÒ ¶§¸¶´Ù ´ÙÀ½ µÎ°¡Áö ¼öÁØÀÇ °Ë»ç°¡ ÀÌ·ç¾îÁø´Ù.
1. ÇÑ ÇÁ·Î¼¼½º°¡ get ½Ã½ºÅÛ È£Ãâ ÁßÀÇ Çϳª¸¦ ÀÌ¿ëÇÏ¿© ÇöÀç Á¸ÀçÇÏ´Â IPCä³Î¿¡ Á¢±ÙÇÒ ¶§¸¶´Ù
È£ÃâÀÚÀÇ flag µ¶¸³ º¯¼ö°¡ mode³¹¸»¿¡ ¾ø´Â Á¢±Ù ºñÆ®¸¦ ÁöÁ¤ÇÏÁö ¾Ê¾Ò´Â°¡¸¦ Ãʱ⿡ °Ë»çÇÑ´Ù.
¿¹¸¦ µé¾î ÇÑ ÀÏ²Û ÇÁ·Î¼¼½º°¡ Áý´Ü Àбâ¿Í ±âŸ Àбâ Çã°¡ ºñÆ®¸¦ 0À¸·Î ÀÔ·Â ¼Ò½Ä ´ë·Õ¿¡ ´ëÇÑ
mode³¹¸»À» Á¤ÇÒ ¼ö°¡ ÀÖ´Ù. ÀÌ·¯ÇÑ ºñÆ®µéÀ» 1·Î ÇÏ´Â flagµ¶¸³º¯¼ö¸¦ °¡Áø ÇÁ·Î¼¼½ºµé¿¡°Ô´Â
½Ã½ºÅÛ È£Ãâ msggetÀ¸·ÎºÎÅÍ ¿¡·¯°¡ µ¹¾Æ ¿Â´Ù.
±×·¯³ª ½Ã½ºÅÛ È£Ãâ get¿¡ ÀÇÇØ¼ ÀÌ·ç¾îÁö´Â ÀÌ·¯ÇÑ °Ë»çµéÀº º°·Î »ç¿ëµÇÁö ¾Ê´Â´Ù.
Áï È£ÃâÀÚ°¡ ÀÚ½ÅÀÌ ¾î´À Çã°¡ ¹üÀ§ - ¼ÒÀ¯ÀÚ,Áý´Ü, ±âŸ - ¿¡ ¼ÓÇÏ´ÂÁö ¾Ë°í ÀÖÀ½À» ÀǹÌÇÑ´Ù.
¸¸¾à »ý¼ºÀÚ°¡ ƯÁ¤ Çã°¡ ºñÆ®¸¦ ²ô°í , È£ÃâÀÚ°¡ ÀÌ ºñÆ®¸¦ ÁöÁ¤Çϰí ÀÖ´Ù¸é ½Ã½ºÅÛ È£Ãâ get¿¡ ÀÇÇØ
¿¡·¯°¡ °¨ÁöµÈ´Ù. ±×·¯³ª ¾î¶² ÇÁ·Î¼¼½ºµçÁö IPC ä³ÎÀÌ ÀÌ¹Ì Á¸ÀçÇϰí ÀÖÀ½À» ¾Ë°í ÀÖ´Ù¸é 0ÀÇ
flag µ¶¸³º¯¼ö¸¦ ÁöÁ¤ÇØ ³õÀ½À¸·Î½á ÀÌ·¯ÇÑ °Ë»ç¸¦ ÀüÀûÀ¸·Î ÇÇÇÒ ¼ö ÀÖ´Ù.
2. ¸ðµç IPC ¿¬»êÀº ±× ¿¬»êÀ» »ç¿ëÇÏ´Â ÇÁ·Î¼¼½º¿¡ ´ëÇØ¼ Çã°¡ »çÇ× °Ë»ç¸¦ ÇÑ´Ù.
¿¹¸¦ µé¾î ÇÁ·Î¼¼½º°¡ ½Ã½ºÅÛ È£Ãâ msgsnd·Î ¼Ò½Ä ´ë·Õ¿¡ ¼Ò½ÄÀ» ³Ö°íÀÚ ÇÒ ¶§¸¶´Ù ÈÀÏ ½Ã½ºÅÛ Á¢±Ù¿¡¼
¼öÇàÇÏ´Â °Í°ú °°Àº °Ë»ç¸¦ ÇÏ°Ô µÈ´Ù.
. Ã¥ÀÓ »ç¿ëÀÚ´Â Ç×»ó Á¢±ÙÀÌ Çã°¡µÈ´Ù.
. ¸¸¾à À¯È¿ »ç¿ëÀÚ ID°¡ ±× IPCä³Î¿¡ ´ëÇÑ uid°ª ¶Ç´Â cuid °ª°ú °°°í ±× IPCä³Î¿¡ ´ëÇÑ
mode ³¹¸»ÀÌ ÀûÀýÇÑ Á¢±Ù Çã°¡ ºñÆ®¸¦ °®°í ÀÖ´Ù¸é, Á¢±ÙÀº Çã¿ëµÈ´Ù.
"ÀûÀýÇÑ Á¢±ÙÇã°¡ ºñÆ®"¶ó ÇÔÀº, È£ÃâÀÚ°¡ IPCä³Î¿¡ Àб⠿¬»êÀÇ ¼öÇàÀ» ¿øÇÏ´Â °æ¿ì
(¿¹¸¦ µé¾î ¼Ò½Ä ´ë·ÕÀ¸·ÎºÎÅÍ ¼Ò½ÄÀ» ¹Þ°í ½ÍÀ» ¶§)Àб⠺ñÆ®°¡ 1·Î µÇ¾î ÀÖ¾î¾ß Çϰí,
¾²±â ¿¬»êÀ» À§Çؼ´Â ¾²±â ºñÆ®°¡ 1·Î µÇ¾î ÀÖ¾î¾ß ÇÔÀ» ÀǹÌÇÑ´Ù.
. À¯È¿ Áý´Ü ID°¡ ±× IPCä³ÎÀÇ gid °ª ¶Ç´Â cgid°ª ÁßÀÇ Çϳª¿Í °°°í ÀûÀýÇÑ Á¢±Ù Çã°¡ ºñÆ®°¡
±× IPCä³ÎÀÇ mode³¹¸»¿¡ Ç¥½ÃµÇ¾î ÀÖÀ¸¸é, Á¢±ÙÀÌ Çã°¡µÈ´Ù.
. À§ÀÇ ¸ðµç °Ë»ç¿¡¼ '¼º°ø'ÀÌ ¾Æ´Ñ °æ¿ì¿¡´Â ÀûÀýÇÑ Çã°¡°¡ °¡´ÉÇÏ·Á¸é IPC ä³ÎÀÇ mode ³¹¸»³»ÀÇ
±âŸ Á¢±Ù Çã°¡ ºñÆ®°¡ 1À̾î¾ß¸¸ ÇÑ´Ù.
ipc_perm ±¸Á¶¿¡¼´Â ¶ÇÇÑ È¨ »ç¿ë ÀÏ·Ã ¹øÈ£(slot usage sequence number)ÀÎ seq¶ó´Â À̸§ÀÇ º¯¼ö¸¦
Æ÷ÇÔÇϰí ÀÖ´Ù.À̰ÍÀº ½Ã½ºÅÛ ³»¿¡¼ °¡´ÉÇÑ ¸ðµç IPCä³Î¿¡ ´ëÇØ ¾Ë¸ÍÀ̰¡ À¯ÁöÇÏ´Â °è¼ö±âÀÌ´Ù.
IPCä³ÎÀÌ ´ÝÈú ¶§¸¶´Ù ¾Ë¸ÍÀÌ´Â ÀÌ È¨ ¹øÈ£¸¦ Áõ°¡½Ã۰í À̰ÍÀÌ ³ÑÄ¡¸é 0À¸·Î µ¹¾Æ°¡°Ô ÇÑ´Ù.
ÀÌ °è¼ö±â°¡ ÇÊ¿äÇÑ ÀÌÀ¯´Â ¿©·¯°¡ÁöÀε¥ ¿ì¼± ¿¸° ÈÀÏ¿¡ ´ëÇØ ¾Ë¸ÍÀ̰¡ À¯ÁöÇÏ´Â ÈÀÏ ÁöÁ¤ ¹øÈ£µéÀ»
»ý°¢ÇØ º¸ÀÚ.
À̵éÀº ÀÛÀº Á¤¼öÀ̰í, ÇÑ ÇÁ·Î¼¼½º ³»¿¡¼¸¸ Àǹ̸¦ °¡Áö¹Ç·Î , À̵éÀº ÇÁ·Î¼¼½º¿¡ ÇÑÁ¤µÈ ¹øÈ£ÀÌ´Ù.
¿¹¸¦ µé¾î ¾î¶² ÇÁ·Î¼¼½º¿¡¼ ÈÀÏ ÁöÁ¤ ¹øÈ£ 4·ÎºÎÅÍ Àб⸦ ¿øÇÑ´Ù¸é ÀÌ ¿¬»êÀº ±× ÇÁ·Î¼¼½º°¡ ÀÌ ÈÀÏ
ÁöÁ¤ ¹øÈ£·Î ¿¾î ³õÀº ÈÀÏÀÌ ÀÖ´Â °æ¿ì¿¡¸¸ Çã¿ëµÈ´Ù.
´Ù¸¥ ¹«°üÇÑ ÇÁ·Î¼¼½º°¡ ÈÀÏ ÁöÁ¤ ¹øÈ£4·Î ¿¾î ³õÀº ÈÀÏ¿¡ ´ëÇØ¼´Â ¾Æ¹«·± ¿µÇâµµ ¹ÌÄ¡Áö ¸øÇÑ´Ù.
±×·¯³ª IPC ä³ÎÀº Àü½Ã½ºÅÛÀû(systemwide)ÀÌ°í Æ¯Á¤ ÇÁ·Î¼¼½º¿¡ ÇÑÁ¤µÈ °ÍÀÌ ¾Æ´Ï´Ù.
½Ã½ºÅÛ È£Ãâ get(msgget,semget,shmget)ÁßÀÇ Çϳª·ÎºÎÅÍ(ÈÀÏ ÁöÁ¤¹øÈ£¿Í ºñ½ÁÇÑ)IPC ½Äº°ÀÚ¸¦
¾òÀ» ¼ö ÀÖ´Ù.
±×·¯³ª, Á¤¼öÇüÀÎ ÀÌ ½Äº°ÀÚµéÀº ½Ã½ºÅÛ ³»ÀÇ ¸ðµç ÇÁ·Î¼¼½ºµé¿¡ ´ëÇØ¼ Àǹ̸¦ °®´Â´Ù.
¿¹¸¦ µé¾î °í°´°ú ÀÏ²Û °°ÀÌ ¼·Î ¿¬°èµÇ¾î ÀÖÁö ¾ÊÀº µÎ ÇÁ·Î¼¼½º°¡ ÇϳªÀÇ ¼Ò½Ä ´ë·ÕÀ» »ç¿ëÇÒ ¶§¿¡
½Ã½ºÅÛ È£Ãâ msgget¿¡¼ µ¹¾Æ¿À´Â ¼Ò½Ä ´ë·Õ ½Äº°ÀÚ´Â µÎ ÇÁ·Î¼¼½º¿¡¼ °°Àº Á¤¼ö°ªÀ» °®´Â´Ù.
À̰ÍÀº ÇöÀç ±âŸ-Àбâ Á¢±ÙÀÌ Çã°¡µÈ ä »ç¿ëÁßÀÎ ¼Ò½Ä´ë·Õ¿¡ ´ëÇØ¼, ºñÇÕ¸®ÀûÀÎ ÇÁ·Î¼¼½ºµéÀÌ ÀÛÀº
Á¤¼öÇü ½Äº°ÀÚ¸¦ »ç¿ëÇÏ¿© ¼Ò½ÄÀ» ÀÐÀ» ¼öµµ ÀÖÀ½À» ÀǹÌÇÑ´Ù. ÀÌ·¯ÇÑ ½Äº°Àڵ鿡 ´ëÇØ¼ »ç¿ë °¡´ÉÇÑ
°ªµéÀÌ ÈÀÏ ÁöÁ¤ ¹øÈ£µéó·³ ÀÛÀº °ªµéÀ̶ó¸é ÇØ´ç ½Äº°ÀÚ¸¦ ¹ß°ßÇÒ È®·üÀÌ 1/50Á¤µµ°¡ µÉ °ÍÀÌ´Ù.
ÀÌ·¯ÇÑ ÀáÀçÀûÀÎ ¹®Á¦¸¦ ÇÇÇϱâÀ§ÇØ System V IPC±â´ÉÀÇ ¼³°èÀÚµéÀº ½Äº°ÀÚ °ªÀÇ °¡´ÉÇÑ ¹üÀ§¸¦
ÀÛÀº Á¤¼ö°¡ ¾Æ´Ï¶ó ¸ðµç Á¤¼ö¸¦ Æ÷ÇÔÇϵµ·Ï È®Àå½ÃÄ×´Ù. À̰ÍÀº IPC Å×À̺í Ç׸ñÀÌ ´Ù½Ã »ç¿ëµÉ
¶§¸¶´Ù È£Ãâ ÇÁ·Î¼¼½º·Î µ¹¾Æ¿À´Â ½Äº°ÀÚ °ªÀ» IPCÇ¥ Ç׸ñ ¼ö¸¸Å Áõ°¡½ÃÅ´À¸·Î½á ±¸ÇöÇÑ´Ù.
¿¹¸¦ µé¾î ¸¸¾à ½Ã½ºÅÛÀÌ ÃÖ´ë 50°³ÀÇ ¼Ò½Ä´ë·ÕÀ» °¡Áú¼ö ÀÖµµ·Ï ±¸¼ºµÇ¾î ÀÖ´Ù¸é óÀ½¿¡´Â ¾Ë¸ÍÀÌÀÇ
ù¹øÂ° ¼Ò½Ä ´ë·Õ Ç¥ Ç׸ñÀÌ »ç¿ëµÇ°í , ±× ÇÁ·Î¼¼½º·Î µ¹¾Æ¿À´Â ½Äº°ÀÚ °ªÀº 0ÀÌ´Ù.
ÀÌ ¼Ò½Ä ´ë·ÕÀÌ Á¦°ÅµÈÈÄ ÀÌ Ã¹¹øÂ° Ç¥ Ç׸ñÀ» ´Ù½Ã »ç¿ëÇÏ¸é µ¹¾Æ ¿À´Â ½Äº°ÀÚ´Â 50ÀÌ´Ù.
±× ÈÄ¿¡´Â ½Äº°ÀÚ°¡ 100ÀÌ µÇ°í, °è¼Ó ÀÌ·± ½ÄÀ¸·Î Áõ°¡ÇÑ´Ù. seq´Â unsigned short Á¤¼öÇüÀ̹ǷÎ
ÀÌ seq´Â Å×ÀÌºí ¿£Æ®¸®°¡ 65,535¹ø »ç¿ëµÈ ÈÄ ¼øÈ¯À» Çü¼ºÇÑ´Ù.
ÀÌ·¯ÇÑ À¯ÇüÀÇ ¿¹·Î ´ÙÀ½ ÇÁ·Î±×·¥À» »ìÆìº¸¸é ÀÌ ÇÁ·Î±×·¥Àº msgget¿¡¼ µ¹¾Æ¿À´Â óÀ½ 10°³ÀÇ
½Äº°ÀÚ°ªÀ» ÀμâÇÑ´Ù.
include
#include
#include
#define KEY ((key_t) 98765L)
#define PERMS 0666
main()
{
int i,msqid;
for (i=0;i<10;i++) {
if ((msqid=msgget(KEY,PERMS|IPC_CREAT)) < 0)
printf("cat't create message queue\n");
printf("msqid = %d\n",msqid);
if (msgctl(msqid,IPC_RMID, (struct msqid_ds *) 0)<0)
printf("can't remove message queue");
}
}
# a.out
msqid =0
msqid =50
msqid =100
msqid =150
msqid =200
msqid =250
msqid =300
msqid =350
msqid =400
msqid =450
o ¼Ò½Ä ´ë·Õ
- ÇÁ·Î¼¼½ºµé°£ÀÇ ¼Ò½Ä Àü´ÞÀÇ ¸î°¡Áö ÇüÅ´ ÇöÀç ¸¹Àº ¿î¿µÃ¼Á¦ÀÇ ÀϺκÐÀÌ µÇ¾ú´Ù.
¸î¸î ¿î¿µÃ¼Á¦¿¡¼´Â ÇÑ ÇÁ·Î¼¼½º°¡ ´Ù¸¥ ƯÁ¤ÇÑ ÇÁ·Î¼¼½º¿¡°Ô¸¸ ¼Ò½ÄÀ» º¸³¾ ¼ö ÀÖµµ·Ï ¼Ò½Ä Àü´ÞÀ»
Á¦¾îÇÑ´Ù. ±×·¯³ª System V¿¡´Â ÀÌ·¯ÇÑ Á¦ÇÑÀÌ ¾ø´Ù.
System VÀÇ ¼Ò½Ä ±¸Çö¿¡¼´Â ¸ðµç ¼Ò½ÄÀº ¾Ë¸ÍÀÌ ¼Ó¿¡ ÀúÀåµÇ¸ç, ÀÌ¿Í °ü·ÃµÈ ¼Ò½Ä ´ë·Õ ½Äº°ÀÚ
(message queue identifier)¸¦ °¡Áø´Ù. ÀÌ ½Äº°ÀÚ¸¦ msqid¶ó ºÎ¸£¸ç ¼Ò½ÄÀÇ Æ¯Á¤ÇÑ ´ë·ÕÀ» °¡¸®Å²´Ù.
ÇÁ·Î¼¼½ºµéÀº ÀÓÀÇÀÇ ´ë·Õ¿¡ ¼Ò½ÄÀ» ÀÐ°í ¾µ ¼ö ÀÖ´Ù.
¾î¶² ÇÁ·Î¼¼½º°¡ ´ë·Õ¿¡ ¼Ò½ÄÀ» ¾²±âÀü¿¡ ÀÌ ¼Ò½ÄÀÌ µµÂøÇϱ⸦ ±â´Ù¸®´Â ÇÁ·Î¼¼½º°¡ Á¸ÀçÇØ¾ß ÇÒ
ÇÊ¿ä´Â ¾ø´Ù. ÀÌ·¯ÇÑ Á¡Àº ÆÄÀÌÇÁ³ª FIFO¿Í´Â ´ëÁ¶ÀûÀ̶ó ÇÒ ¼ö Àִµ¥, ÀÌ·¯ÇÑ °ÍµéÀº Àд ÇÁ·Î¼¼½º°¡
Á¸ÀçÇÏÁö ¾Ê´Â °æ¿ì¿¡´Â ¾²´Â ÇÁ·Î¼¼½º´Â Àǹ̰¡ ¾ø±â ¶§¹®ÀÌ´Ù.
¾î¶² ÇÁ·Î¼¼½º°¡ ´ë·Õ¿¡ ¸î°¡Áö ¼Ò½ÄÀ» ¾²°í ³ ÈÄ¿¡ Á¾·áÇØ ¹ö¸®°í, ³ªÁß¿¡ ´Ù¸¥ ÇÁ·Î¼¼½º°¡ ±× ¼Ò½ÄÀ»
Àд °ÍÀÌ °¡´ÉÇÏ´Ù.
´ë·Õ³»ÀÇ ¸ðµç ¼Ò½ÄÀº ´ÙÀ½°ú °°Àº ¼Ó¼ºÀ» °¡Áø´Ù.
. ±äÁ¤¼öÇü(long integertype)
. ¼Ò½ÄÁßÀÇ µ¥ÀÌŸ ºÎºÐÀÇ ±æÀÌ(0ÀÌ µÉ¼öµµ ÀÖÀ½)
. µ¥ÀÌŸ(¸¸¾à ±æÀ̰¡ 0º¸´Ù Å©´Ù¸é)
½Ã½ºÅÛ³»ÀÇ °¢ ¼Ò½Ä ´ë·Õ¿¡ ´ëÇØ¼ ¾Ë¸ÍÀÌ´Â ´ÙÀ½°ú °°Àº Á¤º¸ ±¸Á¶¸¦ À¯ÁöÇÑ´Ù.
#include
#include
struct msqid_ds {
struct ipc_perm msg_perm; /* operation permission struct */
struct msg *msg_first; /* ptr to first message on q */
struct msg *msg_last; /* ptr to last message on q */
ushort msg_cbytes; /* current # bytes on q */
ushort msg_qnum; /* # of messages on q */
ushort msg_qbytes; /* max # of bytes on q */
ushort msg_lspid; /* pid of last msgsnd */
ushort msg_lrpid; /* pid of last msgrcv */
time_t msg_stime; /* last msgsnd time */
time_t msg_rtime; /* last msgrcv time */
time_t msg_ctime; /* last change time */
};
ipc_permÀº ƯÁ¤ÇÑ ¼Ò½Ä ´ë·Õ¿¡ ´ëÇÑ Á¢±Ù Çã°¡ »çÇ×µéÀ» °¡Áö°í ÀÖ´Ù.
msg ±¸Á¶´Â ¾Ë¸ÍÀÌ¿¡ ÀÇÇØ »ç¿ëµÇ´Â ³»ºÎ µ¥ÀÌŸ ±¸Á¶·Î¼ ƯÁ¤ÇÑ ´ë·Õ¿¡ ´ëÇØ ¼Ò½ÄµéÀÇ
¿¬°á ¸ñ·Ï(linked list)À» À¯ÁöÇÑ´Ù.
page 123 ±×¸² 3.15 ÂüÁ¶
±×¸²Ã³·³ ¾Ë¸ÍÀÌ ¼ÓÀÇ Æ¯Á¤ ¼Ò½Ä ´ë·ÕÀ» ¼Ò½ÄµéÀÇ ¿¬°á ¸ñ·ÏÀ¸·Î¼ ±×¸± ¼ö ÀÖ´Ù.
´ë·Õ¿¡´Â °¢°¢ÀÇ ±æÀ̰¡ 1,2,±×¸®°í 3¹ÙÀÌÆ®ÀÎ 3°³ÀÇ ¼Ò½ÄÀÌ ÀÖ°í ¼Ò½ÄµéÀÌ ¿°ÅµÈ ¼ø¼´ë·Î
¾²¿©Áø´Ù°í ÇÏÀÚ.
¶Ç , ÀÌ·¯ÇÑ ¼¼°³ÀÇ ¼Ò½ÄµéÀº °¢°¢ 100,200,±×¸®°í 300ÀÇ typeÀ» °®°í ÀÖ´Ù°í °¡Á¤ÇÑ´Ù.
msgget ½Ã½ºÅÛ È£Ãâ·Î »õ·Î¿î ¼Ò½Ä ´ë·ÕÀ» ¸¸µé°Å³ª ±âÁ¸ÀÇ ¼Ò½Ä ´ë·Î¿¡ Á¢±ÙÇÒ ¼ö ÀÖ´Ù.
#include
#include
#include
int msgget(key_t key, int msgflag);
msgflagÀÇ °ªÀº ´ÙÀ½¿¡ ÀÖ´Â »ó¼öµéÀÇ Á¶ÇÕÀÌ µÈ´Ù.
-------------------------------------------------------
| Numeric | Symbolic | Description |
-------------------------------------------------------
| 0400 | MSG_R | Read by owner |
| 0200 | MSG_W | Write by owner |
| 0040 | MSG_R >> 3 | Read by group |
| 0020 | MSG_W >> 3 | Write by group |
| 0004 | MSG_R >> 6 | Read by world |
| 0002 | MSG_W >> 6 | Write by world |
| | IPC_CREAT | ¾ÕÀå ÂüÁ¶ |
| | IPC_EXCL | ¾ÕÀå ÂüÁ¶ |
-------------------------------------------------------
msgget¿¡ µ¹¾Æ¿À´Â °ªÀº ¼Ò½Ä ´ë·Õ ½Äº°ÀÚÀÎ msqidÀÌÁö¸¸, ¸¸¾à ¿¡·¯°¡ ¹ß»ýÇß´Ù¸é -1 °ªÀÌ µ¹¾Æ¿Â´Ù.
msggetÀ¸·Î ¼Ò½Ä ´ë·ÕÀ» Çѹø ¿¸é, msgsnd ½Ã½ºÅÛ È£ÃâÀ» »ç¿ëÇÏ¿© ´ë·Õ¿¡ ¼Ò½Ä Çϳª¸¦ ³ÖÀ» ¼ö ÀÖ´Ù.
#include
#include
#include
int msgsnd(int msqid, struct msgbuf *ptr, int length, int flag );
µ¶¸³º¯¼ö prtÀº ´ÙÀ½°ú °°Àº ¸ð¾çÀ» °®´Â ±¸Á¶¿¡ ´ëÇÑ Áö½ÃÀÚÀÌ´Ù.(À̰ÍÀº ¿¡ Á¤ÀǵǾî ÀÖ´Ù.)
struct msgbuf {
long mtype; /* message type, must be > 0 */
char mtext[1]; /* message data */
mtext´Â ¼Ò½ÄÀÇ µ¥ÀÌŸ ºÎºÐÀÌ´Ù. ÀÌ ºÎºÐÀº ¹®ÀÚ¸¸À» À§ÇÑ °ÍÀÌ ¾Æ´Ï¹Ç·Î À̸§ÀÌ À߸øµÇ¾ú´Ù.
µ¥ÀÌŸÀÇ ÇüÅ·δ ÀÌÁø µ¥ÀÌŸ³ª ¹®ÀÚ ¾î´À °ÍÀ̳ª °¡´ÉÇÏ´Ù. 0ÀÇ ¼Ò½ÄÇüÀº msgrcv ½Ã½ºÅÛÈ£Ãâ¿¡¼
Ưº°ÇÑ Ç¥½ÄÀ¸·Î »ç¿ëµÇ¹Ç·Î ¼Ò½Ä ÇüÀº 0º¸´Ù Ä¿¾ß ÇÑ´Ù.
msgsndÀÇ length µ¶¸³ º¯¼ö´Â ¹ÙÀÌÆ® ´ÜÀ§·Î ¼Ò½ÄÀÇ ±æÀ̸¦ ³ªÅ¸³½´Ù. À̰ÍÀº long integer ¼Ò½ÄÇü
µÚ¿¡ ¿À´Â »ç¿ëÀÚ Á¤ÀÇ µ¥ÀÌŸÀÇ ±æÀÌ´Ù. ÀÌ ±æÀÌ´Â 0ÀÌ µÉ ¼ö ÀÖ´Ù.
flag µ¶¸³ º¯¼ö´Â IPC_NOWAIT³ª 0À¸·Î ÁöÁ¤ÇÒ ¼ö ÀÖ´Ù. IPC_NOWAIT°ªÀº ¼Ò½Ä ´ë·Õ¿¡ »õ·Î¿î ¼Ò½ÄÀ»
À§ÇÑ ¿©À¯ °ø°£ÀÌ ¾øÀ» °æ¿ì Áï½Ã ½Ã½ºÅÛ È£Ãâ¿¡¼ µ¹¾Æ¿Àµµ·Ï ÇÑ´Ù. ÀÌ·¯ÇÑ »óÇ×Àº ƯÁ¤ÇÑ ´ë·Õ¿¡
³Ê¹« ¸¹Àº ¼Ò½ÄÀÌ Àְųª ½Ã½ºÅÛ Àüü¿¡ ³Ê¹« ¸¹Àº ¼Ò½ÄÀÌ ÀÖÀ» °æ¿ì¿¡ ÀϾÙ.
¸¸¾à¿¡ ¼Ò½ÄÀ» À§ÇØ ÇÊ¿äÇÑ °ø°£ÀÌ ¾ø°í IPC_NOWAIT°¡ ¸í½ÃµÇ¾î ÀÖ´Ù¸é msgsnd´Â -1À» µ¹·ÁÁÖ°í
errno´Â EAGAINÀ» °®°Ô µÈ´Ù. ¸¸¾à ½Ã½ºÅÛ È£ÃâÀÌ ¼º°øÇÑ´Ù¸é msgsnd´Â 0À» µ¹·Á ÁØ´Ù.
msgrcv ½Ã½ºÅÛ È£ÃâÀ» »ç¿ëÇÏ¿© ¼Ò½Ä ´ë·Õ¿¡¼ ¼Ò½ÄÀ» ÀÐÀ» ¼ö ÀÖ´Ù.
#include
#include
#include
int msgrcv(int msqid, struct msgbuf *ptr, int length, long msgtype, int flag);
ptr µ¶¸³ º¯¼ö´Â msgsnd¿¡¼¿Í ºñ½ÁÇÏ¸ç ¹ÞÀº ¼Ò½ÄÀ» ÀúÀåÇÒ Àå¼Ò¸¦ ¸í½ÃÇÑ´Ù.
len´Â ptrÀÌ Áö½ÃÇÏ´Â ±¸Á¶ÀÇ µ¥ÀÌŸ ºÎºÐÀÇ Å©±â¸¦ ¸í½ÃÇÑ´Ù.
À̰ÍÀº ½Ã½ºÅÛ È£Ãâ¿¡¼ º¹±ÍÇÏ´Â µ¥ÀÌŸÀÇ ÃÖ´ë¾çÀÌ´Ù. ¸¸¾à flag µ¶¸³ º¯¼ö¿¡¼ MSG_NOERROR
ºñÆ®°¡ ¼³Á¤µÇ¸é À̰ÍÀº ¹ÞÀº ¼Ò½ÄÀÇ ½ÇÁ¦ µ¥ÀÌŸ ºÎºÐÀÌ lengthº¸´Ù Å©´Ù¸é Áï½Ã µ¥ÀÌŸ ºÎºÐÀ»
ÀÚ¸£°í ¿¡·¯¾øÀÌ º¹±ÍÇÑ´Ù´Â °ÍÀ» ³ªÅ¸³½´Ù.
¹Ý´ë·Î MSG_NOERRORÇ¥½Ã±â¸¦ ¸í½ÃÇÏÁö ¾Ê°í length°¡ Àüü ¼Ò½ÄÀ» ¹ÞÀ» ¼ö ÀÖÀ» Á¤µµ·Î ÃæºÐÈ÷ Å©Áö
¾Ê´Ù¸é ¿¡·¯°¡ ÀϾ´Â ¿øÀÎÀÌ µÈ´Ù.
±äÁ¤¼öÀÎ msgtype µ¶¸³º¯¼ö´Â ´ë·ÕÀ¸·ÎºÎÅÍ ¾î¶² ¼Ò½ÄÀ» ¿ä±¸ÇÏ´ÂÁö¸¦ ¸í½ÃÇÑ´Ù.
. msgtypeÀÌ 0À̶ó¸é, ´ë·ÕÀÇ Ã¹¹øÂ° ¼Ò½ÄÀ» ¹Þ´Â´Ù. °¢ ¼Ò½Ä ´ë·ÕÀº ¸ÕÀú µé¾î¿À´Â °ÍÀÌ ¸ÕÀú
³ª°¡µµ·Ï À¯ÁöµÇ¹Ç·Î msgtypeÀÌ 0À̶ó´Â °ÍÀº ´ë·Õ¿¡¼ °¡Àå ¿À·¡µÈ ¼Ò½ÄÀÌ ÁÖ¾îÁø´Ù´Â °ÍÀ»
¶æÇÑ´Ù.
. msgtypeÀÌ 0º¸´Ù Å©´Ù¸é, msgtype°ú µ¿ÀÏÇÑ ÇüÀ» °®´Â ù¹øÂ° ¼Ò½ÄÀ» ¹Þ´Â´Ù.
. msgtypeÀÌ 0º¸´Ù ÀÛ´Ù¸é, msgtypeÀÇ Àý´ëÄ¡º¸´Ù °°°Å³ª ÀÛÀº ÇüÁß¿¡¼ °¡Àå ÀÛÀº ÇüÀ» °®´Â
ù¹øÂ° ¼Ò½ÄÀ» ¹Þ´Â´Ù.
msgtypeÀÇ ¿©·¯°¡Áö °ª¿¡ ´ëÇØ ¹ÞÀ» ¼Ò½ÄÀ» º¸¿©ÁØ´Ù.
------------------------------------------
| msgtype | Type of message returned |
------------------------------------------
| 0L | 100 |
| 100L | 100 |
| 200L | 200 |
| 300L | 300 |
| -100L | 100 |
| -200L | 100 |
| -300L | 100 |
------------------------------------------
flag µ¶¸³ º¯¼ö´Â ¿ä±¸µÈ ÇüÀÇ ¼Ò½ÄÀÌ ´ë·Õ¿¡ ¾øÀ» °æ¿ì¿¡ ¾î¶»°Ô ÇÒ °ÍÀÎÁö¸¦ ¸í½ÃÇÑ´Ù.
¸¸¾à IPC_NOWAITºñÆ®°¡ ¼³Á¤µÇ¾ú´Ù¸é, msgrcv ½Ã½ºÅÛ È£ÃâÀº ¼Ò½ÄÀÌ ¾øÀ» °æ¿ì¿¡ Áï½Ã µ¹¾Æ¿Â´Ù.
ÀÌ °æ¿ì¿¡ ½Ã½ºÅÛ È£ÃâÀº errno¸¦ ENOMSG·Î ¼³Á¤Çϰí -1À» µ¹·Á ÁØ´Ù.
±×·¸Áö ¾Ê´Ù¸é, È£ÃâÇÑ ÇÁ·Î¼¼½º´Â ´ÙÀ½ÁßÀÇ ¾î¶² Çϳª°¡ ÀϾ ¶§±îÁö Áö¿¬µÈ´Ù.
. ¿ä±¸µÈ ÇüÀÇ ¼Ò½ÄÀÌ µµÂøÇÑ´Ù.
. ¼Ò½Ä ´ë·ÕÀÌ ½Ã½ºÅÛ¿¡¼ Á¦°ÅµÈ´Ù.
. ÇÁ·Î¼¼½º°¡ ½ÅÈ£¸¦ ¹Þ¾Æ Æ÷ÂøÇÑ´Ù.
msgrcv´Â ¼º°øÀûÀΠȣÃâ¿¡ ´ëÇØ¼´Â ¹ÞÀº ¼Ò½ÄÀÇ µ¥ÀÌŸ ¹ÙÀÌÆ® ¼ö¸¦ µ¹·ÁÁØ´Ù. À̰ÍÀº ptrµ¶¸³ º¯¼ö¸¦
ÅëÇØ º¹±ÍÇÏ´Â ¼Ò½ÄÀÇ Å©±â(long integer)¸¦ Æ÷ÇÔÇÏÁö ¾Ê´Â´Ù.
msgctl ½Ã½ºÅÛ È£ÃâÀº ¼Ò½Ä ´ë·Õ¿¡ ´ëÇÑ ´Ù¾çÇÑ Á¦¾î ±â´ÉÀ» Á¦°øÇÑ´Ù.
#include
#include
#include
int msgctl(int msqid, int cmd, struct msqid_ds *buff);
IPC_RMID¸¦ °®´Â cmd´Â ´ÜÁö ½Ã½ºÅÛ¿¡¼ ¼Ò½Ä ´ë·ÕÀ» Á¦°ÅÇÏ´Â °ÍÀ¸·Î ¿©±â¼´Â À̰͸¸ »ç¿ëÇÑ´Ù.
o °øÀ¯ ±â¾ï Àå¼Ò (Shared Memory)
- °í°´-ÀÏ²Û ÈÀÏ º¹Á¦ ÇÁ·Î±×·¥¿¡ »ç¿ëµÇ´Â Åë»óÀûÀÎ ¸î°¡Áö ´Ü°è¸¦ °í·ÁÇØ º¸ÀÚ.
. ÀϲÛÀÌ ÀÔ·Â ÈÀÏ¿¡¼ Àд´Ù. ÀÌ·¯ÇÑ µ¿ÀÛÀº º¸Åë ¾Ë¸ÍÀ̰¡ µ¥ÀÌŸ¸¦ ÀÚ½ÅÀÇ ³»ºÎ µ¢ÀÌ ¿ÏÃæ¿µ¿ª
(block buffer)ÁßÀÇ Çϳª·Î ÀоîµéÀ̰í À̰ÍÀ» ÀϲÛÀÇ ¿ÏÃæ ¿µ¿ª(½Ã½ºÅÛ È£Ãâ readÀÇ µÎ¹øÂ° µ¶¸³ º¯¼ö)
À¸·Î º¹Á¦ÇÏ´Â µÎ°¡Áö µ¿ÀÛÀ¸·Î ÀÌ·ç¾îÁø´Ù. ´ëºÎºÐÀÇ À¯´Ð½º ½Ã½ºÅÛÀº Àϲۿ¡ ÀÇÇØ ÇàÇØÁö´Â °Í°ú
°°Àº ¼øÂ÷ Àб⸦ °¨ÁöÇϸé, read ¿ä±¸¿¡ ¾Õ¼ Çѵ¢À̸¦ ¹Ì¸® ÀÐÀ¸·Á°í ÇÑ´Ù.
À̰ÍÀ» ÈÀÏÀ» º¹Á¦Çϴµ¥ °É¸®´Â ½Ã°£À» ´ÜÃà½ÃŰÁö¸¸ ¸ðµç read¿¡ ´ëÇÑ µ¥ÀÌŸ°¡ ¾Ë¸ÍÀÌ¿¡ ÀÇÇØ
µ¢ÀÌ ¿ÏÃæ ¿µ¿ª¿¡¼ È£ÃâÇÑ ÇÁ·Î¼¼½ºÀÇ ¿ÏÃæ ¿µ¿ªÀ¸·Î º¹Á¦µÇ´Â °Í°ú °ü°è°¡ ¾ø´Ù.
. ÀϲÛÀº ÀÌ Àå¿¡¼ ¼³¸íµÈ ÆÄÀÌÇÁ, FIFO, ¼Ò½Ä ´ë·ÕµîÀÇ ±â¹ýÁß¿¡ Çϳª¸¦ »ç¿ëÇÏ¿© ÀÌ·¯ÇÑ µ¥ÀÌŸ¸¦
¼Ò½Ä ¾È¿¡ ¾µ ¼ö ÀÖ´Ù. ÀÌ·¯ÇÑ ¼¼°¡Áö IPC ÇüÅÂÀÇ ¾î´Â °ÍÀ̳ª µ¥ÀÌŸ°¡ »ç¿ëÀÚÀÇ ¿ÏÃæ ¿µ¿ª¿¡¼
¾Ë¸ÍÀÌ·Î º¹Á¦µÇ¾î¾ß ÇÑ´Ù.
. °í°´Àº IPCä³Î¿¡¼ µ¥ÀÌŸ¸¦ Àдµ¥ À̶§, ´Ù½Ã µ¥ÀÌŸ¸¦ ¾Ë¸ÍÀÌÀÇ IPC ¿ÏÃæ ¿µ¿ª¿¡¼ °í°´ÀÇ
¿ÏÃæ ¿µ¿ªÀ¸·Î º¹Á¦ÇÏ¿©¾ß ÇÑ´Ù.
. ¸¶Áö¸·À¸·Î µ¥ÀÌŸ´Â ½Ã½ºÅÛ È£Ãâ writeÀÇ µÎ¹øÂ° µ¶¸³ º¯¼öÀÎ °í°´ÀÇ ¿ÏÃæ ¿µ¿ª¿¡¼ Ãâ·ÂÈÀÏ·Î
º¹Á¦µÈ´Ù. ÀÌ ½Ã½ºÅÛ È£ÃâÀº µ¥ÀÌŸ¸¦ ¹Ù·Î ¾Ë¸ÍÀÌ ¿ÏÃæ ¿µ¿ªÀ¸·Î º¹Á¦ÇÏ°í º¹±ÍÇϸç,
ÀÌÈÄ ¾Æ¹«¶§³ª ¾Ë¸ÍÀÌ´Â ±â±â¿¡ ½ÇÁ¦ÀûÀÎ ¾²±â¸¦ ÇÑ´Ù.
ÀüüÀûÀ¸·Î µ¥ÀÌŸ¸¦ ³×¹ø º¹Á¦ÇÏ´Â °ÍÀÌ ÇÊ¿äÇÏ´Ù. ÀÌ·¯ÇÑ ³×¹øÀÇ º¹Á¦´Â ¾Ë¸ÍÀÌ¿Í »ç¿ëÀÚ ÇÁ·Î¼¼½º°£¿¡¼
ÇàÇØÁø´Ù. ÀÌ·¯ÇÑ º¹Á¦¸¦ ¹®¸Æ°£ º¹Á¦(intercontext copy)¶ó°í ÇÑ´Ù.
´ëºÎºÐÀÇ À¯´Ð½º ±¸Çö¿¡´Â °¡´ÉÇÑÇÑ º¹Á¦¸¦ ºü¸£°Ô ÇϰíÀÚ ÇÏÁö¸¸ ¿©ÀüÈ÷ ¸¹Àº ºñ¿ëÀÌ ¿ä±¸µÈ´Ù.
´ÙÀ½Àº µÎ ÇÁ·Î¼¼½º»çÀÌ¿¡¼ ÀÌ·¯ÇÑ µ¥ÀÌŸÀÇ À̵¿À» ±×¸²À¸·Î º¸¿©ÁØ´Ù.
--------------- ---------------
| client | | server |
--------------- ---------------
\ ¢Ø / ¢Ö
\ \ / /
\ ----------------------------------
\| \ ----------------- / / |
|\ \ | FIFO, pipe | / / |
output | \ -- | or message |<- ---|-------- input
file <-----------|-- ----------------- | file
-----------------------------------
kernel
< °í°´°ú ÀϲۻçÀÌ¿¡¼ÀÇ ÀüÇüÀûÀÎ µ¥ÀÌŸ À̵¿ >
ÀÌ·¯ÇÑ IPCÇüÅÂ(ÆÄÀÌÇÁ, FIFO, ¼Ò½Ä´ë·Õ)¿Í °ü·ÃµÈ ¹®Á¦´Â µÎ ÇÁ·Î¼¼½º°¡ Á¤º¸¸¦ ±³È¯Çϱâ À§Çؼ
Á¤º¸°¡ ¾Ë¸ÍÀ̸¦ °ÅÃİ¡¾ß ÇÑ´Ù´Â °ÍÀÌ´Ù.
°øÀ¯ ±â¾ï Àå¼Ò´Â µÎ°³ ÀÌ»óÀÇ ÇÁ·Î¼¼½º°¡ ±â¾ï Àå¼Ò Á¶°¢À» °øÀ¯Çϵµ·Ï ÇØ¼ ÀÌ·¯ÇÑ ¹®Á¦¸¦ ÇØ°áÇØ ÁØ´Ù.
¹°·Ð ´Ù¼öÀÇ ÇÁ·Î¼¼½º°¡ ±â¾ï Àå¼ÒÀÇ ÀϺθ¦ °øÀ¯Çϱâ À§Çؼ´Â ´Ù¼öÀÇ ÇÁ·Î¼¼½ºµéÀÌ ±×µé »çÀÌ¿¡¼
±â¾ï Àå¼ÒÀÇ »ç¿ë¿¡ ´ëÇØ ÇùÁ¶ÇØ¾ß ÇÏ´Â ¹®Á¦°¡ ÀÖ´Ù.
(±â¾ï Àå¼ÒÀÇ ÀϺκÐÀ» °øÀ¯ÇÏ´Â °ÍÀº ÈÀÏ Àá±Ý ¿¹¿¡¼ »ç¿ëµÇ¾ú´ø ¼øÂ÷ ¹øÈ£ ÈÀÏó·³ µð½ºÅ© ÈÀÏÀ»
°øÀ¯ÇÏ´Â °Í°ú ºñ½ÁÇÏ´Ù)
¿¹¸¦ µé¸é , ÇÑ ÇÁ·Î¼¼½º°¡ °øÀ¯ ±â¾ï Àå¼Ò¸¦ Àд´ٸé , ´Ù¸¥ ÇÁ·Î¼¼½º´Â µ¥ÀÌŸ¸¦ ó¸®Çϱâ Àü¿¡
ÀбⰡ ³¡³ª±â¸¦ ±â´Ù·Á¾ß ÇÑ´Ù. ´ÙÇàÈ÷µµ, À̰ÍÀº À̰ÍÀº µ¿±âȸ¦ À§ÇÑ Â÷´Ü Ç¥½Ã±â¸¦ »ç¿ëÇϸé
½±°Ô ÇØ°áÇÒ ¼ö ÀÖ´Ù.
ÀÌÁ¦ °í°´-ÀÏ²Û ¿¹¿¡¼ÀÇ ´Ü°èµéÀº ´ÙÀ½°ú °°ÀÌ µÈ´Ù.
. ÀϲÛÀº Â÷´Ü Ç¥½Ã±â¸¦ »ç¿ëÇÏ¿© °øÀ¯ ±â¾ï Àå¼Ò Á¶°¢À¸·Î Á¢±ÙÇÑ´Ù.
. ÀϲÛÀº ÀÔ·Â ÈÀÏÀ» °øÀ¯ ±â¾ï Àå¼Ò Á¶°¢À¸·Î ÀоîµéÀδÙ. ÀоîµéÀÏ ÁÖ¼Ò(½Ã½ºÅÛ È£Ãâ readÀÇ
µÎ¹øÂ° µ¶¸³ º¯¼ö)´Â °øÀ¯ ±â¾ï Àå¼Ò¸¦ °¡¸®Å²´Ù.
. ÀбⰡ ¿Ï·áµÇ¸é ÀϲÛÀº ´Ù½Ã Â÷´Ü Ç¥½Ã±â¸¦ »ç¿ëÇÏ¿© °í°´¿¡°Ô ¾Ë¸°´Ù.
. °í°´Àº °øÀ¯ ±â¾ï Àå¼Ò Á¶°¢¿¡¼ Ãâ·Â ÈÀÏ·Î µ¥ÀÌŸ¸¦ ¾´´Ù.
¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡ -------------------- ¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡
¦ client ¦<---> | shared memory |<---> ¦ server ¦
¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡ -------------------- ¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡
/ ¢Ø
/ \
¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡
output ¦ / \ ¦ input
file <------¦------- ------¦----- file
¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡¦¡
kernel
< °øÀ¯ ±â¾ï Àå¼Ò¸¦ ÀÌ¿ëÇÑ °í°´°ú Àϲ۰£ÀÇ µ¥ÀÌŸ À̵¿ >
ÀÌ ±×¸²¿¡¼ µ¥ÀÌŸ´Â ´ÜÁö µÎ¹ø¸¸ º¹Á¦µÇ¸é µÈ´Ù. Áï, ÀÔ·Â ÈÀÏ¿¡¼ °øÀ¯ ±â¾ï Àå¼Ò·Î ±×¸®°í
°øÀ¯ ±â¾ï Àå¼Ò¿¡¼ Ãâ·Â ÈÀÏ·Î º¹Á¦µÈ´Ù. ÀÌ·¯ÇÑ µÎ¹øÀÇ º¹Á¦´Â ¾Õ¿¡¼ ¾ð±ÞµÈ °Íó·³ ¾Ë¸ÍÀÌÀÇ
µ¢ÀÌ ¿ÏÃæ ¿µ¿ªµµ Æ÷ÇԵȴÙ.
¸ðµç °øÀ¯ ±â¾ï Àå¼Ò Á¶°¢¿¡ ´ëÇØ¼ ¾Ë¸ÍÀÌ´Â ´ÙÀ½°ú °°Àº Á¤º¸ ±¸Á¶¸¦ À¯ÁöÇÑ´Ù.
#include
#include
struct shmid_ds {
struct ipc_perm shm_perm; /* operation permission struct */
uint shm_segsz; /* size of segment in bytes */
struct XXX shm_YYY; /* implementation dependent info */
ushort shm_lpid; /* pid of last shmop */
ushort shm_cpid; /* pid of creator */
ushort shm_nattch; /* number of current attaches */
time_t shm_atime; /* last shmat time */
time_t shm_dtime; /* last shmdt time */
time_t shm_ctime; /* last change time */
};
ipc_perm ±¸Á¶´Â ¾Õ¿¡¼ ¼³¸íÇÑ °Íó·³ °øÀ¯ ±â¾ï Àå¼Ò Á¶°¢¿¡ ´ëÇÑ Á¢±Ù Çã°¡»çÇ×À» ´ã°í ÀÖ´Ù.
¼Ò½Ä´ë·ÕÀ̳ª Â÷´Ü Ç¥½Ã±â¿Í´Â ´Ù¸£°Ô, ±»Àº¸ð¿Í ±¸Çö¿¡ Á÷Á¢ÀûÀ¸·Î °ü°è°¡ ÀÖÀ¸¹Ç·Î, °øÀ¯ ±â¾ï Àå¼Ò
Á¶°¢À» °¡¸®Å°±â À§ÇØ ¾Ë¸ÍÀ̰¡ »ç¿ëÇÏ´Â ½ÇÁ¦ µ¥ÀÌŸ ±¸Á¶¸¦ ¼³¸íÇÒ ¼ö ¾ø´Ù.
À§ÀÇ ±¸Á¶¿¡¼ Ç¥±â XXX ¿Í YYY´Â ÀÌ »ç½ÇÀ» ³ªÅ¸³»±â À§ÇÏ¿© »ç¿ëµÈ °ÍÀÌ´Ù.
½Ã½ºÅÛ È£Ãâ shmgetÀ» »ç¿ëÇÏ¿© °øÀ¯ ±â¾ïÀå¼Ò Á¶°¢À» »ý¼ºÇϰųª ±âÁ¸ÀÇ °Í¿¡ Á¢±ÙÇÒ ¼ö ÀÖ´Ù.
#include
#include
#incldue
int shmget (key_t key, int size, int shmflag);
shmgetÀÌ µ¹·ÁÁÖ´Â °ªÀº °øÀ¯ ±â¾ï Àå¼Ò ½Äº°ÀÚÀÎ shmidÀÌ°í ¸¸¾à ¿¡·¯°¡ ÀϾ°Ô µÇ¸é -1À» µ¹·ÁÁØ´Ù.
size µ¶¸³ º¯¼ö´Â ¹ÙÀÌÆ® ´ÜÀ§·Î Á¶°¢ÀÇ Å©±â¸¦ ³ªÅ¸³½´Ù.
shmflag µ¶¸³º¯¼ö´Â ´ÙÀ½ ±×¸²°ú °°Àº »ó¼öµéÀÇ Á¶ÇÕÀÌ´Ù.
-------------------------------------------------------
| Numeric | Symbolic | Description |
-------------------------------------------------------
| 0400 | SHM_R | Read by owner |
| 0200 | SHM_W | Write by owner |
| 0040 | SHM_R >> 3 | Read by group |
| 0020 | SHM_W >> 3 | Write by group |
| 0004 | SHM_R >> 6 | Read by world |
| 0002 | SHM_W >> 6 | Write by world |
| | IPC_CREAT | ¾ÕÀå ÂüÁ¶ |
| | IPC_EXCL | ¾ÕÀå ÂüÁ¶ |
-------------------------------------------------------
< shmget ½Ã½ºÅÛ È£ÃâÀ» À§ÇÑ shmflag°ª >
shmgetÀº °øÀ¯ ±â¾ï Àå¼Ò Á¶°¢À» »ý¼ºÇϰųª ¿¼ö´Â ÀÖÁö¸¸ È£Ãâ ÇÁ·Î¼¼½º°¡ ±×Á¶°¢À¸·Î Á¢±Ù ÇÒ ¼ö
ÀÖµµ·Ï ÇØÁÖÁö´Â ¾Ê´Â´Ù. ½Ã½ºÅÛ È£Ãâ shmatÀ» È£ÃâÇÏ¿© °øÀ¯ ±â¾ï Àå¼Ò Á¶°¢À» ºÙ¿©¾ß ÇÑ´Ù.
#include
#include
#include
char *shmat (int shmid, char *shmaddr, int shmflag);
ÀÌ ½Ã½ºÅÛ È£ÃâÀº °øÀ¯ ±â¾ï Àå¼Ò Á¶°¢ÀÇ ½ÃÀÛ ÁÖ¼Ò¸¦ µ¹·Á ÁØ´Ù. ÀÌ ÁÖ¼Ò¸¦ °áÁ¤ÇÏ´Â ±ÔÄ¢Àº
´ÙÀ½°ú °°´Ù.
. shmaddr µ¶¸³º¯¼ö°¡ 0À̸é, ½Ã½ºÅÛÀº È£ÃâÇÑ ÇÁ·Î¼¼½º¸¦ À§ÇÑ ÁÖ¼Ò¸¦ ¼±Á¤ÇÑ´Ù.
. shmaddr µ¶¸³º¯¼ö°¡ 0ÀÌ ¾Æ´Ï¸é, µ¹·ÁÁÖ´Â ÁÖ¼Ò¸¦ È£Ãâ ÇÁ·Î¼¼½º°¡ shmflag µ¶¸³º¯¼ö·Î
SHM_RND°ªÀ» ¸í½ÃÇß´ÂÁö ¿©ºÎ¿¡ µû¶ó ´Ù¸£´Ù.
- ¸¸¾à SHM_RND°ªÀÌ ¸í½ÃµÇÁö ¾Ê¾Ò´Ù¸é, °øÀ¯ ±â¾ï Àå¼Ò Á¶°¢Àº shmaddr µ¶¸³º¯¼ö¿¡ ÀÇÇØ
¸í½ÃµÈ ÁÖ¼Ò¿¡ ºÙÀδÙ.
- ¸¸¾à SHM_RND°ªÀÌ ¸í½ÃµÇ¾ú´Ù¸é, °øÀ¯±â¾ï Àå¼Ò Á¶°¢Àº shmaddr µ¶¸³ º¯¼ö¿¡ ÀÇÇØ ¸í½ÃµÈ
ÁÖ¼Ò¸¦ »ó¼ö SHMLBA(LBA sms "lower bound address"ÀÇ ¾àÀÚÀÌ´Ù)¸¸Å °¨¼Ò½ÃŲ ÁÖ¼Ò¿¡
ºÙÀδÙ.
½ÇÁ¦ÀûÀÎ ¸ñÀû¿¡¼´Â ÀÌ½Ä °¡´ÉÇÑ shmat¿¡ ´ëÇÑ È£Ãâ·Î½á shmaddrÀ» 0À¸·Î ¸í½ÃÇϰí, ¾Ë¸ÍÀ̰¡
ÁÖ¼Ò¸¦ ¼±ÅÃÇϵµ·Ï ÇÑ´Ù.
±âº»ÀûÀ¸·Î´Â °øÀ¯ ±â¾ï Àå¼Ò Á¶°¢Àº È£Ãâ ÇÁ·Î¼¼½º°¡ ÀÐ°í ¾µ ¼ö ÀÖµµ·Ï ºÎÂøÇÑ´Ù.
¶ÇÇÑ, "Àбâ Àü¿ë"Á¢±ÙÀ» ¸í½ÃÇÏ¸é¼ SHM_RDONLY °ªÀ» shmflag µ¶¸³º¯¼ö¿¡ ¸í½ÃÇÒ ¼ö ÀÖ´Ù.
ÇÁ·Î¼¼½º°¡ °øÀ¯ ±â¾ï Àå¼Ò Á¶°¢ÀÇ »ç¿ëÀ» ³¡³ª°Ô µÇ¸é ½Ã½ºÅÛ È£Ãâ shmdtÀ» »ç¿ëÇÏ¿© Á¶°¢À»
ºÐ¸®ÇÑ´Ù.
#include
#include
#include
int shmdt (char *shmaddr);
ÀÌ È£ÃâÀº °øÀ¯ ±â¾ï Àå¼Ò Á¶°¢À» ¾ø¾ÖÁö´Â ¾Ê´Â´Ù. °øÀ¯ ±â¾ï Àå¼Ò Á¶°¢À» Á¦°ÅÇϱâ À§Çؼ´Â
½Ã½ºÅÛ È£Ãâ shmctlÀ» »ç¿ëÇÑ´Ù.
#include
#include
#include
int shmctl (int shmid, int cmd, struct shmid_ds *buf);
cmd°ªÀ¸·Î IPC_RMID¸¦ ¸í½ÃÇÏ¸é ½Ã½ºÅÛ¿¡¼ °øÀ¯ ±â¾ï Àå¼Ò Á¶°¢À» Á¦°ÅÇÑ´Ù.
Revision History
ÀÛ¼ºÀÏÀÚ : 96.06.17
ÀÛ¼ºÀÚ : ÀÌÁø¼ö
¼öÁ¤ÀÏÀÚ :
¼öÁ¤ÀÚ