ÃÑ ÆäÀÌÁö ¼ö : 3224
![]()
|
Facebook Joinc ±×·ì
Joinc QA »çÀÌÆ®
![]()
Tweet
joinc´Â Firefox¿Í chrome¿¡¼ Å×½ºÆ® Çß½À´Ï´Ù. IE¿¡¼´Â Å×À̺íÀÌ ±úÁö°Å³ª À̹ÌÁö°¡ º¸ÀÌÁö ¾ÊÀ» ¼ö ÀÖ½À´Ï´Ù. ƯÈ÷ ±¸±Û DocsÀ̹ÌÁöÀÇ °æ¿ì ¿¢¹Úó¸®µÉ ¼ö ÀÖ½À´Ï´Ù. 1 IPC1.1 IPC ¼Ò°³
À§ÀÇ ±×¸²Àº 2Àå¿¡¼ °£´ÜÈ÷ ¼³¸íÇß´ø ¸®´ª½º Ä¿³Î ±¸Á¶±×¸²ÀÌ´Ù. À̹øÀå¿¡´Â ÀÌÁß IPC ¿¡ ´ëÇØ¼ ´Ù·ê °ÍÀÌ´Ù.
±×¸²¿¡¼ ó·³ Process´Â ¿ÏÀüÈ÷ µ¶¸³µÈ ½ÇÇఴüÀÌ´Ù. ¼·Î µ¶¸³µÇ¾îÀÖ´Ù´Â °ÍÀº ´Ù¸¥ ÇÁ·Î¼¼½ºÀÇ ¿µÇâÀ» ¹ÞÁö ¾Ê´Â´Ù´Â ÀåÁ¡ÀÌ ÀÖ´Ù. ±×·¯³ª µ¶¸³µÇ¾î ÀÖÀ¸´Ï ¸¸Å º°µµÀÇ ¼³ºñ°¡ ¾øÀÌ´Â ¼·Î°£¿¡ Åë½ÅÀÌ ¾î·Æ´Ù´Â ¹®Á¦°¡ ÀÖ´Ù. ÀÌ ¹®Á¦´Â ÀÌ ÀüÀåÀÇ ¾²·¹µå¿Í ºñ±³Çغ¸¸é µÎµå·¯Áø´Ù.
À̸¦ À§Çؼ Ä¿³Î¿µ¿ª¿¡¼ IPC¶ó´Â ³»ºÎ ÇÁ·Î ¼¼½º°£ Åë½Å - Inter Process Communication -À» Á¦°øÇÑ´Ù. ÇÁ·Î¼¼½º´Â Ä¿³ÎÀÌ Á¦°øÇÏ´Â IPC¼³ºñ¸¦ ÀÌ¿ëÇØ¼ ÇÁ·Î¼¼½º°£ Åë½ÅÀ» ÇÒ ¼ö ÀÖ´Ù. 1.2 System V IPC ¿Í POSIX IPC
IPC¿¡´Â µÎ °¡Áö Ç¥ÁØÀÌ ÀÖ´Ù. Çϳª´Â ¿À·¡µÈ ¹öÀüÀÇ System V IPCÀ̰í, ´Ù¸¥ Çϳª´Â ºñ±³Àû ÃÖ±Ù¿¡ °³¹ßµÈ POSIX IPC´Ù. System V IPC´Â ¿À·£ ¿ª»ç¸¦ °¡Áø ¸¸Å ÀÌ ±âÁ¾°£ ÄÚµå ȣȯ¼ºÀ» È®½ÇÈ÷ º¸ÀåÇØ ÁÖÁö¸¸, API°¡ Á» ±¸½ÄÀ̸ç ÇÔ¼ö¸íµµ ¸íÈ®ÇÏÁö ¾Ê´Ù. POSIX IPC´Â Á÷°üÀûÀ¸·Î API°¡ ±¸¼ºµÇ¾î ÀÖ¾î¼ Á» ´õ »ç¿ëÇϱ⠽±´Ù.
¿ì¼±Àº System V IPC¸¦ ´Ù·ç°í ³ªÁß¿¡ ½Ã°£ÀÌ µÇ¸é POSIX IPC¸¦ ´Ù·çµµ·Ï ÇϰڴÙ. ¸ÞÄ¿´ÏÁòÀº µ¿ÀÏ ÇϹǷΠ¾î´À °ÍÀ» ¹è¿ìµç Å« ¹®Á¦´Â µÇÁö ¾ÊÀ» °ÍÀÌ´Ù. ÇÊ¿äÇϸé System V IPC¿Í ´ëÀÀÇÏ´Â POSIX IPC ÇÔ¼öµéÀ» ¼³¸íÇϵµ·Ï ÇϰڴÙ. 2 IPC ¼³ºñµé
Çö½Ç¿¡¼µµ Çʿ信 µû¶ó ´Ù¾çÇÑ Åë½Å ¼³ºñµéÀÌ Á¸ÀçÇÏ´Â °Íó·³ IPC¿¡µµ ´Ù¾çÇÑ ¼³ºñµéÀÌ Á¸ÀçÇÑ´Ù. °¢°¢ÀÇ Çʿ信 µû¶ó Àû´çÇÑ Åë½Å¼³ºñµéÀÌ ÁغñµÇ¾î¾ß ÇÏ´Â °Í°ú ¸¶Âù°¡Áö·Î ³»ºÎ ÇÁ·Î¼¼½º°£ Åë½Å¿¡µµ ±× »óȲ¿¡ ¸Â´Â IPC ¼³ºñ¸¦ ¼±ÅÃÇÒ Çʿ䰡 ÀÖ´Ù.
»óȲ¿¡ ¸Â´Â IPCÀÇ ¼±ÅÃÀº ƯÈ÷ fork¸¦ ÀÌ¿ëÇØ¼ ¸¸µé¾îÁø ¸ÖƼÇÁ·Î¼¼½ºÀÇ ÇÁ·Î±×·¥¿¡ ÀÖ¾î¼ Áß¿äÇÏ´Ù. À߸øµÈ IPC ¼³ºñÀÇ ¼±ÅÃÀº ÄÚµù°úÁ¤À» ¾î·Æ°Ô ¸¸µé°Å³ª ÇÁ·Î±×·¥ÀÇ ÀÛµ¿À» È¿À²ÀûÀÌÁö ¸øÇÏ°Ô ¸¸µé ¼ö Àֱ⠶§¹®ÀÌ´Ù.
¿©±â¿¡¼´Â Ä¿³ÎÀÌ Á¦°øÇÏ´Â °¢°¢ÀÇ IPC ¼³ºñµéÀÇ »ç¿ë¹ý°ú ÀåÁ¡¹× ´ÜÁ¡ ¾î¶² °æ¿ì¿¡ ½á¾ßÇÏ´ÂÁö¿¡ ´ëÇØ¼ ¼³¸íÇÒ °ÍÀÌ´Ù. 2.1 PIPE
pipe´Â ¿ì¸®°¡ »ý°¢ÇÏ´Â ±× ÆÄÀÌÇÁ¿Í ºñ½ÁÇÏ°Ô ÀÛµ¿ÇÑ´Ù°í º¸¸éµÈ´Ù. Áï ¼öµµ ÆÄÀÌÇÁ¿Í °°Àº ÀÛµ¿ ¿ø¸®´Ù.
À§ ±×¸²Àº pipeÀÇ ÀÛµ¿¿ø¸®¸¦ º¸¿©ÁÖ°í ÀÖ´Ù. ÆÄÀÌÇÁ´Â µÎ°³ÀÇ ÇÁ·Î¼¼½º¸¦ ¿¬°áÇÑ´Ù. ÇϳªÀÇ ÇÁ·Î¼¼½º´Â ´ÜÁö µ¥ÀÌÅ͸¦ ¾²±â¸¸ ÇÏ°í ´Ù¸¥ ÇϳªÀÇ ÇÁ·Î¼¼½º´Â ´ÜÁö Àб⸸ ÇÒ ¼ö ÀÖ´Ù. ÇÑÂÊ ¹æÇâÀ¸·Î¸¸ Åë½ÅÀÌ °¡´ÉÇÑ ÀÌ·¯ÇÑ ÆÄÀÌÇÁÀÇ Æ¯Â¡ ¶§¹®¿¡ Half-duplex Åë½Å (¹ÝÀÌÁß Åë½Å) ¶ó°í ºÎ¸£±âµµ ÇÑ´Ù. ÀÌ¿Í ´Þ¸® ÇϳªÀÇ Åë½Å¼±·Î¸¦ ÀÌ¿ëÇØ¼ ¼Û½Å°ú ¼ö½ÅÀ» ¸ðµÎ ÇÒ ¼ö ÀÖ´Â ¹æ½ÄÀ» Full-duplex Åë½Å (ÀüÀÌÁß Åë½Å)À̶ó°í ºÎ¸¥´Ù.
pipe¿Í °°Àº ¹ÝÀÌÁß Åë½ÅÀÇ °æ¿ì ÇϳªÀÇ Åë½Å¼±·Î´Â Àб⳪ ¾²±â Áß Çϳª¸¸ °¡´ÉÇϱ⠶§¹®¿¡ ¸¸¾à Àбâ¿Í ¾²±â Áï ¼Û¼ö½ÅÀ» ¸ðµÎ ÇÏ±æ ¿øÇÑ´Ù¸é ¾Æ·¡Ã³·³ µÎ°³ÀÇ pipe¸¦ ¸¸µé¾î¾ß¸¸ ÇÑ´Ù.
2.1.1 pipeÀÇ »ç¿ë
pipe´Â pipe(2)¶ó´Â ÇÔ¼ö¸¦ ÀÌ¿ëÇØ¼ ¸¸µé ÀÖ´Ù. #include <unistd.h> int pipe(int filedes[2]);ÇÔ¼öÀÇ ÀÎÀÚ·Î intÇü ¹è¿ÀÌ µé¾î°¡´Â Á¡¿¡ À¯ÀÇÇÏÀÚ. ¹è¿ÀÌ ³Ñ¾î°¡´Â ÀÌÀ¯´Â ÀÌ ÇÔ¼ö°¡ ÀбâÀü¿ëÀÇ ÆÄÀÌÇÁ¿Í ¾²±âÀü¿ëÀÇ ÆÄÀÌÇÁ 2°³¸¦ ¸®ÅÏÇØ Áֱ⠶§¹®ÀÌ´Ù. ¹è¿ÀÇ 0¹øÂ°¿¡´Â Àб⸦ À§ÇÑ ÆÄÀÌÇÁ, 1¹øÂ°¿¡´Â ¾²±â¸¦ À§ÇÑ ÆÄÀÌÇÁÀÇ Áö½Ã¹øÈ£°¡ µé¾î°£´Ù.
´ÙÀ½Àº pipe¸¦ ÅëÇØ¼ Åë½ÅÀ» ÇÏ´Â °£´ÜÇÑ ÇÁ·Î±×·¥ÀÌ´Ù. 001 #include <unistd.h> 002 #include <stdlib.h> 003 #include <stdio.h> 004 005 int main() 006 { 007 int n, fd[2]; 008 char buf[255]; 009 int pid; 010 011 if (pipe(fd) < 0) 012 { 013 perror("pipe error : "); 014 exit(0); 015 } 016 017 // ÆÄÀÌÇÁ¸¦ »ý¼ºÇÑ´Ù. 018 if ((pid = fork()) < 0) 019 { 020 perror("fork error : "); 021 exit(0); 022 } 023 024 // ¸¸¾à ÀÚ½ÄÇÁ·Î¼¼½º¶ó¸é ÆÄÀÌÇÁ¿¡ ÀÚ½ÅÀÇ PID Á¤º¸¸¦ ¾´´Ù. 025 else if (pid == 0) 026 { 027 close(fd[0]); 028 while(1) 029 { 030 memset(buf, 0x00, 255); 031 sprintf(buf, "Hello Mother Process. My name is %d\n", getpid()); 032 write(fd[1], buf, strlen(buf)); 033 sleep(1); 034 } 035 } 036 037 // ¸¸¾à ºÎ¸ðÇÁ·Î¼¼½º¶ó¸é ÆÄÀÌÇÁ¿¡¼ µ¥ÀÌŸ¸¦ ÀоîµéÀδÙ. 038 else 039 { 040 close(fd[1]); 041 while(1) 042 { 043 memset(buf, 0x00, 255); 044 n = read(fd[0], buf, 255); 045 fprintf(stderr, "%s", buf); 046 } 047 } 048 } 049
2.1.2 pipeÀÇ ÀåÁ¡°ú ´ÜÁ¡
pipe´Â ¸Å¿ì °£´ÜÇÏ°Ô »ç¿ëÇÒ ¼ö ÀÖ´Ù´Â ÀåÁ¡ÀÌ ÀÖ´Ù. ¸¸¾à ÇÑÂÊ ÇÁ·Î¼¼½º°¡ ´ÜÁö Àб⸸ ÇÏ°í ´Ù¸¥ ÂÊ ÇÁ·Î¼¼½º´Â ´ÜÁö ¾²±â¸¸ ÇÏ´Â ´Ü¼øÇÑ µ¥ÀÌÅÍ È帧À» °¡Áø´Ù¸é °í¹Î ¾øÀÌ pipe¸¦ »ç¿ëÇÏ¸é µÈ´Ù.
´ÜÁ¡Àº ¹ÝÀÌÁß Åë½ÅÀ̶ó´Â Á¡ÀÌ´Ù. ¸¸¾à ÇÁ·Î¼¼½º°¡ Àбâ¿Í ¾²±â Åë½Å ¸ðµÎ¸¦ ÇØ¾ß ÇÑ´Ù¸é pipe¸¦ µÎ°³ ¸¸µé¾î¾ß Çϴµ¥, ±¸ÇöÀÌ ²Ï³ª º¹ÀâÇØ Áú ¼ö ÀÖ´Ù. read¿Í write°¡ ±âº»ÀûÀ¸·Î block(ºÀ¼â)·Î ÀÛµ¿Çϱ⠶§¹®À¸·Î ÇÁ·Î¼¼½º°¡ read´ë±âÁßÀ̶ó¸é read°¡ ³¡³ª±â Àü¿¡´Â write¸¦ ÇÒ¼ö°¡ ¾ø°Ô µÈ´Ù. ¸¸¾à µÎ°³ÀÇ ÇÁ·Î¼¼½º°¡ ¸ðµÎ read ÁßÀ̶ó¸é ¿µ¿øÈ÷ blockµÇ°Ô µÉ °ÍÀÌ´Ù.
ÀÌ·¯ÇÑ ¹®Á¦´Â fork¸¦ ÀÌ¿ëÇØ¼ Àбâ Àü¿ë ÇÁ·Î¼¼½º¿Í ¾²±â Àü¿ë ÇÁ·Î¼¼½º 2°³¸¦ ¸¸µé°Å³ª ȤÀº (³ªÁß¿¡ ´Ù·ç°Ô µÉ)ÀÔÃâ·Â ´ÙÁßȸ¦ ÀÌ¿ëÇØ¼ ÇØ°áÇØ¾ß ÇÑ´Ù. ¾î¶² ¹æ¹ýÀ» ¾²´õ¶óµµ ±¸ÇöÀÌ º¹ÀâÇØÁö´Â °É ÇÇÇÒ ¼ö ¾ø´Ù.
¸¸¾à ÀüÀÌÁß Åë½ÅÀ» °í·ÁÇØ¾ßµÉ »óȲÀ̶ó¸é pipe ´Â ÁÁÀº ¼±ÅÃÀÌ ¾Æ´Ï´Ù. 2.2 FIFO
FIFO´Â First In First Out ÀÇ ÁÙÀÓ¸»ÀÌ´Ù. ¸ÕÀú ÀÔ·ÂµÈ°Ô ¸ÕÀú Ãâ·ÂµÇ´Â ¼±ÀÔ¼±ÃâÀÇ µ¥ÀÌÅÍ ±¸Á¶¸¦ ÀǹÌÇÑ´Ù. IPC ¼³ºñ·Î½áÀÇ FIFO ¶ó¸é ¸ÕÀú ÀÔ·ÂµÈ µ¥ÀÌÅͰ¡ ¸ÕÀú Àü´ÞµÇ´Â ³»ºÎÅë½Å ¼³ºñ·Î ÇØ¼®ÇÒ ¼ö ÀÖÀ» °ÍÀÌ´Ù. ±×·¯³ª ÀÌ·¯ÇÑ ÇØ¼®Àº »ç¿ëÀÚ¸¦ È¥¶õ½ÃŰ´Â Ãø¸éÀÌ ÀÖ´Ù. ¾Õ¼ÀÇ pipe ¿ª½Ã ¼±ÀÔ¼±ÃâÀÇ µ¥ÀÌÅÍ Àü´Þ ¸ÞÄ¿´ÏÁòÀ» µû¸£±â ¶§¹®ÀÌ´Ù.
±×·¯´Ï FIFO´Â ¼±ÀÔ¼±ÃâÀ̶ó´Â µ¥ÀÌÅͱ¸Á¶·Î½áÀÇ ¹üÁÖ°¡ ¾Æ´Ñ named pipe¶ó´Â ±¸Á¶Àû Ãø¸éÀ¸·Î½á ¹Ù¶óº¸µµ·Ï ÇÑ´Ù. ÀÌÇÏ FIFO´Â named pipe¶ó°í ºÎ¸£±â·Î ÇϰڴÙ. 2.2.1 pipe ¿Í named pipe
¾Õ¼ ÀÌ¹Ì ¹è¿î pipe¿Í named pipeÀÇ Â÷ÀÌÁ¡¿¡ ´ëÇØ¼ ¾Ë¾Æº¸µµ·Ï ÇÏÀÚ. ¸ÕÀú ÀÔ·ÂµÈ µ¥ÀÌÅͰ¡ ¸ÕÀú Àü´ÞµÇ´Â È帧À» °¡Áø´Ù´Â Ãø¸é¿¡¼ µ¿ÀÏÇÑ µ¥ÀÌÅÍ È帧 ¸ÞÄ¿´ÏÁòÀ» °¡Áø´Ù.
Â÷ÀÌÁ¡À̶ó¸é named pipe ´Â »ç¿ëÇÒ pipe¸¦ ¸í¸íÇÒ ¼ö ÀÖ´Ù´Â Á¡ÀÌ µÉ °ÍÀÌ´Ù. pipe´Â »ç¿ëÇÒ ÆÄÀÌÇÁ¸¦ ¸í¸íÇÒ ¼ö°¡ ¾ø´Ù. ÀÌ·± Àǹ̿¡¼ pipe´Â ¶§¶§·Î À͸í pipe¶ó°í ºÎ¸£±âµµ ÇÑ´Ù.
±×·³ ÆÄÀÌÇÁ¸¦ À͸íÀ¸·Î ¸¸µå´Â °Í°ú ¸í¸í - named - ÇØ¼ »ç¿ëÇÏ´Â °ÍÀÇ Â÷ÀÌÁ¡¿¡ ´ëÇØ¼ ¾Ë¾Æº¸µµ·Ï ÇÏÀÚ.
ÀÍ¸í ÆÄÀÌÇÁ´Â µ¥ÀÌÅÍ Åë½ÅÀ» ÇÒ ÇÁ·Î¼¼½º°¡ ¸íÈ®ÇÏ°Ô ¾Ë ¼ö ÀÖÀ» ¶§ »ç¿ëÇÑ´Ù. ¼Û½ÅÇÒ ÇÁ·Î¼¼½º´Â ¼ö½ÅÇÒ ÇÁ·Î¼¼½º¸¦ ¾Ë°í, ¼ö½ÅÇÒ ÇÁ·Î¼¼½º´Â ¼Û½ÅÇÒ ÇÁ·Î¼¼½º¸¦ ¾Æ´Â °æ¿ì´Ù. °¡Àå ´ëÇ¥ÀûÀÎ ¿¹´Â ºÎ¸ðÇÁ·Î¼¼½º¿Í ÀÚ½ÄÇÁ·Î¼¼½º°£¿¡ µ¥ÀÌÅÍ Åë½ÅÀ» ÇϰíÀÚ ÇÏ´Â °æ¿ì´Ù. ÀÚ½Ä ÇÁ·Î¼¼½º¿Í ºÎ¸ð ÇÁ·Î¼¼½º´Â ¼·Î¸¦ ¸íÈ®È÷ ¾Ë°í ÀÖÀ¸¹Ç·Î ±»ÀÌ ÆÄÀÌÇÁ¿¡ À̸§À» ÁÙÇʿ䰡 ¾øÀ» °ÍÀÌ´Ù. ºÎ¸ð¿Í Àڽİ£ÀÌ´Ï ±»ÀÌ À̸§ÀÌ ¾ø¾îµµ ´ëȰ¡ ÅëÇÏÁö ¾Ê°Ú´Â°¡ ?
¹Ý¸é, Àڽİú ºÎ¸ðÇÁ·Î¼¼½º°¡ ¾Æ´Ñ Áï ÀüÇô ¸ð¸£´Â ÇÁ·Î¼¼½ºµé »çÀÌ¿¡¼ pipe¸¦ ÀÌ¿ëÇØ¼ Åë½ÅÀ» ÇØ¾ßÇÏ´Â °æ¿ì¸¦ »ý°¢Çغ¸ÀÚ. »ýÆÇ ¸ð¸£´Â »ç¶÷°ú ´ëȸ¦ ÇÏ·Á¸é À̸§À» ¾Ë°í ÀÖ¾î¾ß ÇϵíÀÌ, ÀüÇô °ü·Ã¾ø´Â ÇÁ·Î¼¼½ºµé »çÀÌ¿¡¼ pipe¸¦ ÀÌ¿ëÇØ¼ Åë½ÅÀ» ÇÏ·Á¸é pipe¿¡ À̸§ÀÌ ÁÖ¾îÁ®¾ß ÇÑ´Ù. named pipe ¸¦ ¸¸µç ÀÌÀ¯´Ù.
ÀÌÁ¦ named pipe °¡ Á¸ÀçÇÏ´Â ¹æ½ÄÀ» ¾Ë¾Æº¸µµ·Ï ÇÏÀÚ. º¹ÀâÇÏ°Ô »ý°¢ÇÒ °Í ¾ø´Ù. ¸®´ª½º¿¡¼ ¸ðµç °ÍÀº ÆÄÀÏ·Î ÅëÇÑ´Ù°í ÇÑ °ÍÀ» ±â¾ïÇϰí ÀÖÀ» °ÍÀÌ´Ù. named pipeµµ ÆÄÀÏ·Î Á¸ÀçÇÑ´Ù. pipe ÆÄÀÏÀÌ Á¸ÀçÇϰí, ÀÌ ÆÄÀÏÀÇ À̸§ÀÌ ¹Ù·Î pipeÀÇ nameÀÌ µÈ´Ù. ÆÄÀÏÀº ½Ã½ºÅÛ Àü¿ªÀûÀ¸·Î °ü¸®ÇÏ´Â °´Ã¼ÀÌ´Ï, À̸§¸¸ ¾È´Ù¸é ¾î¶² ÇÁ·Î¼¼½º¶óµµ Á¢±ÙÀÌ °¡´ÉÇÏ´Ù. ÀÌÁ¦ ¼·Î °ü·Ã¾ø´Â ÇÁ·Î¼¼½ºµéµµ named pipe¸¦ ÀÌ¿ëÇØ¼ Åë½ÅÀ» ÇÒ ¼ö ÀÖ°Ô µÇ¾ú´Ù. 2.2.2 ½Ã½ºÅÛ ¸í·ÉÀ» ÀÌ¿ëÇÑ named pipeÀÇ »ý¼º
named pipe´Â ÆÄÀÏÀÇ ÇüÅ·ΠÁ¸ÀçÇϸç ÇÁ·Î¼¼½º¿Í ÀüÇô °ü·ÃÀÌ ¾ø±â ¶§¹®¿¡, ÇÁ·Î¼¼½º¿Í °ü·Ã¾øÀÌ µ¶ÀÚÀûÀÎ ÆÄÀÏÀÇ ÇüÅ·ΠÁ¸ÀçÇÏ°Ô ÇÒ ¼ö ÀÖ´Ù. ÇØ¼ ¹Ýµå½Ã ÇÁ·Î¼¼½º »ý¼ºÈÄ¿¡ Åë½Å¼±·Î°¡ °³¼³µÇ´Â pipe¿Í ´Þ¸® named pipe´Â ¹Ì¸® ÆÄÀÏ·Î ¸¸µé¾î µÑ ¼ö ÀÖ´Ù. ÀÏ´Ü ÆÄÀÏ·Î ¸¸µé¾î µÐ ´ÙÀ½¿¡, ¾²°í ½ÍÀº ÇÁ·Î¼¼½º°¡ ÆÄÀÌÇÁ¸¦ ¿¾î¼ Åë½ÅÀ» ÇÏ´Â ¹æ½ÄÀÌ´Ù. °øÁßÀüÈ¿Í ºñ½ÁÇÏ´Ù°í³ª ÇÒ ¼ö ÀÖÀ» °Í °°´Ù.
¸®´ª½º´Â mkfifo ¶ó´Â ½Ã½ºÅÛ ¸í·É¾î¸¦ ÀÌ¿ëÇØ¼ named pipe¸¦ »ý¼ºÇÒ ¼ö ÀÖ´Ù. # mkfifo mypipels ¸¦ ÀÌ¿ëÇØ¼ ÆÄÀÏÀÇ Æ¯¼ºÀ» ¾Ë¾Æº¸µµ·Ï ÇÏÀÚ. # ls -al mypipe prw-r--r-- 1 yundream yundream 0 2009-04-16 19:23 mypipe°¡Àå ¾ÕÀÇ p´Â ÀÌ ÆÄÀÏÀÌ pipe ÀÓÀ» ÀǹÌÇÑ´Ù. ¼º°øÀûÀ¸·Î mypipe¶ó´Â À̸§À» °¡Áö´Â pipe°¡ »ý¼ºµÇ¾úÀ½À» È®ÀÎÇÒ ¼ö ÀÖ´Ù. 2.2.3 ¸®´ª½º Ç¥ÁضóÀ̺귯¸® ÇÔ¼ö¸¦ ÀÌ¿ëÇÑ named pipeÀÇ »ý¼º
½Ã½ºÅÛ ¸í·ÉÀ» ÀÌ¿ëÇØ¼ named pipe (ÀÌÇÏ ÆÄÀÌÇÁ)¸¦ »ý¼ºÇÒ ¼ö ÀÖÁö¸¸ À̰ɷδ Á» ºÎÁ·ÇÏ´Ù. ¿ì¸®´Â ½Ã½ºÅÛ ÇÁ·Î±×·¡¸Ó ÀÌ´Ï, ÇÁ·Î±×·¥³»¿¡¼ ÆÄÀÌÇÁ¸¦ »ý¼ºÇÒ ¼ö ÀÖ¾î¾ß ÇÑ´Ù. ¸®´ª½º´Â Ç¥ÁØ ¶óÀ̺귯¸®¿¡¼ mkfifo(3)À̶ó´Â ÆÄÀÌÇÁ »ý¼º ÇÔ¼ö¸¦ Á¦°øÇÑ´Ù. #include <sys/types.h> #include <sys/stat.h> int mkfifo ( const char *pathname, mode_t mode );
´ÙÀ½Àº ÀÎÀÚ·Î ÁÖ¾îÁø ¹®ÀÚ¿À» À̸§À¸·Î °¡Áö´Â ÆÄÀÌÇÁ¸¦ »ý¼ºÇÏ´Â °£´ÜÇÑ ÇÁ·Î±×·¥ÀÌ´Ù. #include <sys/types.h> #include <sys/stat.h> #include <unistd.h> #include <stdio.h> #include <stdlib.h> int main(int argc, char **argv) { int state; if (argc !=2 ) { fprintf(stderr,"Usage : %s [filename]\n", argv[0]); return 1; } state = mkfifo("/tmp/myfifo", S_IRUSR|S_IWUSR); if (state < 0) { perror("mkfifo error \n"); return 1; } return 0; } 2.2.4 mknod ½Ã½ºÅÛ È£ÃâÀ» ÀÌ¿ëÇÑ ÆÄÀÌÇÁ »ý¼º
¾Õ¼ mkfifo(3)À» ÀÌ¿ëÇØ¼ °£´ÜÇÏ°Ô ÆÄÀÌÇÁ¸¦ »ý¼ºÇØ º¸¾Ò´Ù. ±×·¯³ª ¿ØÁö ±âºÐÀÌ ¼®¿¬Ä¡ ¾Ê´Ù. Ç¥ÁØ ¶óÀ̺귯¸®¿¡¼ Á¦°øÇÏ´Â ÇÔ¼ö¸¦ ÀÌ¿ëÇ߱⠶§¹®ÀÌ´Ù. ±×·¡µµ ½Ã½ºÅÛ ÇÁ·Î±×·¡¹ÖÀÌ´Ï ÀÌ¿ÕÀ̸é, ½Ã½ºÅÛÄÝÀ» ÀÌ¿ëÇØ¼ Àú¼öÁØ¿¡¼ Á¢±ÙÀ» ÇØº¸¾Æ¾ß¸¸ ÇÒ °Í °°Àº ±âºÐÀÌ µç´Ù.
¸®´ª½º´Â mknod(2)¶ó´Â ½Ã½ºÅÛÄÝÀ» Á¦°øÇÑ´Ù. mknod´Â Ư¼öÆÄÀÏÀÇ »ý¼ºÀ» À§Çؼ Ä¿³Î¿¡¼ Á¦°øÇÏ´Â ÇÔ¼ö·Î »ç¿ë¹æ¹ýÀº ´ÙÀ½°ú °°´Ù. include <sys/stat.h> int mknod(const char *path, mode_t mode, dev_t dev);
¾Æ·¡´Â mknod¸¦ ÀÌ¿ëÇØ¼ named pipe¸¦ »ý¼ºÇÏ´Â °£´ÜÇÑ ÇÁ·Î±×·¥ÀÌ´Ù. #include <sys/stat.h> int main(int argc, char **argv) { mknod(argv[1], S_IFIFO, 0); return 0; }
mknod´Â named pipe ¿Ü¿¡µµ ¹®ÀÚÀåÄ¡ÆÄÀÏ, ºí·°ÀåÄ¡ÆÄÀÏ, Unix Domain SocketµîÀÇ ÆÄÀϵ鵵 »ý¼ºÇÒ ¼ö ÀÖ´Ù. ÀÚ¼¼ÇÑ ³»¿ëÀº mknod(2) ¸Þ´º¾ó ¹®¼¸¦ Âü°íÇϱ⠹ٶõ´Ù. 2.2.5 named pipe¸¦ ÀÌ¿ëÇÑ µ¥ÀÌÅÍ Åë½Å
named pipe¸¦ ÀÌ¿ëÇϸé ÀüÇüÀûÀÎ ¼¹ö/Ŭ¶óÀÌ¾ðÆ® ¸ðµ¨À» µû¸£´Â ÇÁ·Î±×·¥ÀÇ ÀÛ¼ºÀÌ °¡´ÉÇÏ´Ù. Ŭ¶óÀÌ¾ðÆ®´Â ¿äûÀ» ÇÏ´Â ÇÁ·Î±×·¥ÀÌ°í ¼¹ö´Â ¿äûÀ» ¹Þ¾Æ¼ ó¸®ÇÏ°í ±× °á°ú¸¦ µÇµ¹·ÁÁÖ´Â ÇÁ·Î±×·¥ÀÌ´Ù. ¼¹ö/Ŭ¶óÀÌ¾ðÆ® ¸ðµ¨Àº ÀϹÝÀûÀ¸·Î ÀÎÅÍ³Ý ¼ºñ½º¿¡ ¸Å¿ì Àͼ÷ÇÑ ¹æ½ÄÀÌ´Ù. apache¿Í °°Àº À¥¼¹ö¿Í firefox, ie ¿Í °°Àº Ŭ¶óÀÌ¾ðÆ® ÇÁ·Î±×·¥ÀÌ ´ëÇ¥ÀûÀÎ ¿¹ÀÌ´Ù.
½Ã½ºÅÛ ÇÁ·Î±×·¡¹Ö¿¡¼µµ ÀÌ·¯ÇÑ ¼¹ö/Ŭ¶óÀÌ¾ðÆ® ¸ðµ¨Àº ¸Å¿ìÀÚÁÖ »ç¿ëµÈ´Ù. ÀÎÅͳݿ¡¼ÀÇ ¼¹ö/Ŭ¶óÀÌ¾ðÆ® º¸´Ù ±× ¿ª»çµµ ¿À·¡µÇ¾ú´Ù°í º¼ ¼ö ÀÖ´Ù.
¿©±â¿¡¼´Â °£´ÜÇÑ °è»ê ÇÁ·Î±×·¥À» named pipe¸¦ ÀÌ¿ëÇØ¼ ¸¸µé¾î º¸µµ·Ï ÇϰڴÙ. À̵é ÇÁ·Î±×·¥Àº ¼¹ö/Ŭ¶óÀÌ¾ðÆ® ¸ðµ¨À» µû¸£µµ·Ï ÇÒ °ÍÀÌ´Ù. ¼¹öÇÁ·Î±×·¥ÀÇ À̸§Àº calc_server.c À̰í Ŭ¶óÀÌ¾ðÆ® ÇÁ·Î±×·¥ÀÇ À̸§Àº calc.c ÀÌ´Ù. calc.c °¡ µÎ°³ÀÇ ¼ýÀÚ¸¦ named pipe¸¦ ÀÌ¿ëÇØ¼ calc_server¿¡ ³Ñ±â¸é, calc_server ´Â °è»êÀ» ÇØ¼ calc·Î ³Ñ°ÜÁÖµµ·Ï ÇÒ °ÍÀÌ´Ù. 2.3 Message Queue
Queue(Å¥)´Â ¼±ÀÔ¼±ÃâÀÇ ÀڷᱸÁ¶¸¦ °¡Áö´Â Åë½Å¼³ºñ·Î Ä¿³Î¿¡¼ °ü¸®ÇÑ´Ù. ÀÔÃâ·Â ¹æ½ÄÀ¸·Î º¸ÀÚ¸é named pipe¿Í µ¿ÀÏÇÏ´Ù°í º¼ ¼ö ÀÖÀ» °ÍÀÌ´Ù. named pipe¿Í ´Ù¸¥ Á¡À̶ó¸é name pipe°¡ µ¥ÀÌÅÍÀÇ È帧À̶ó¸é ¸Þ½ÃÁöÅ¥´Â ¸Þ¸ð¸®°ø°£À̶ó´Â Á¡ÀÌ´Ù. ÆÄÀÌÇÁ°¡ ¾Æ´Ñ, ¾îµð¿¡¼³ª ¹°°ÇÀ» ²¨³¾¼ö ÀÖ´Â ÄÁÅ×ÀÌ³Ê º§Æ®¶ó°í º¸¸é µÉ °ÍÀÌ´Ù.
¸Þ½ÃÁöÅ¥ÀÇ ÀåÁ¡Àº ÄÁÅ×ÀÌ³Ê º§Æ®°¡ °¡Áö´Â ÀåÁ¡À» ±×´ë·Î °¡Áø´Ù. ÄÁÅ×ÀÌ³Ê º§Æ®¿¡ ¿Ã¶ó¿Ã ¹°°Ç¿¡ ¶óº§À» ºÙÀÌ¸é µ¿½Ã¿¡ ´Ù¾çÇÑ ¹°°ÇÀ» ´Ù·ê ¼ö ÀÖ´Â °Í°ú °°ÀÌ, ¸Þ½ÃÁöÅ¥¿¡ ¾µ µ¥ÀÌÅÍ¿¡ ¹øÈ£¸¦ ºÙÀÓÀ¸·Î½á, ¿©·¯°³ÀÇ ÇÁ·Î¼¼½º°¡ µ¿½Ã¿¡ µ¥ÀÌÅ͸¦ ½±°Ô ´Ù·ê ¼ö ÀÖ´Ù. 2.3.1 ¸Þ½ÃÁö Å¥ÀÇ »ý¼º
¸Þ½ÃÅ¥ÀÇ »ý¼º°ú Á¢±ÙÀº msgget(2) ÇÔ¼ö¸¦ ÅëÇØ¼ ÀÌ·ç¾îÁø´Ù. #include <sys/types.h> #include <sys/ipc.h> #include <sys/msg.h> int msgget(key_t key, int msgflg);
2.3.2 µ¥ÀÌÅÍ ¾²±â¿Í Àбâ
¸®´ª½º Ä¿³ÎÀº ¾²±â¿Í Àб⸦ À§Çؼ °¢°¢ msgsnd(2) ¿Í msgrcv(2) ÇÔ¼ö¸¦ Á¦°øÇÑ´Ù. #include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
int msgsnd (int msqid, (void *)msgp, size_t msgsz, int msgflg)
ssize_t msgrcv (int msqid, struct msgbuf *msgp, size_t msgsz,
long msgtyp, int msgflg)
struct msgbuf
{
long mtype; // ¸Þ½ÃÁö ŸÀÔ
char mtext[BUFF_SIZE]; // º¸³»°íÀÚ ÇÏ´Â µ¥ÀÌÅÍ
}
2.4 °øÀ¯¸Þ¸ð¸® - Shared Memory
µ¥ÀÌÅ͸¦ °øÀ¯ÇÏ´Â ¹æ¹ý¿¡´Â Å©°Ô µÎ°¡Áö°¡ ÀÖ´Ù. Çϳª´Â Åë½ÅÀ» ÀÌ¿ëÇØ¼ µ¥ÀÌÅ͸¦ ÁÖ°í ¹Þ´Â °ÍÀ̰í, ´Ù¸¥ Çϳª´Â µ¥ÀÌÅ͸¦ ¾Æ¿¹ °øÀ¯ wÁï ÇÔ²² »ç¿ëÇÏ´Â °ÍÀÌ´Ù. pipe, named pipe, message queue°¡ Åë½ÅÀ» ÀÌ¿ëÇÑ ¼³ºñ¶ó¸é °øÀ¯¸Þ¸ð¸®°¡ µ¥ÀÌÅÍ ÀÚü¸¦ °øÀ¯Çϵµ·Ï Áö¿øÇÏ´Â ¼³ºñ´Ù.
ÇÁ·Î¼¼½º´Â ÀڽŸ¸ÀÇ ¸Þ¸ð¸®¿µ¿ªÀ» °¡Áö°í ÀÖ´Ù. ÀÌ ¸Þ¸ð¸® ¿µ¿ªÀº ´Ù¸¥ ÇÁ·Î¼¼½º°¡ Á¢±ÙÇØ¼ ÇԺηΠµ¥ÀÌÅ͸¦ Àаųª ¾²Áö ¸øÇϵµ·Ï Ä¿³Î¿¡ ÀÇÇØ¼ º¸È£°¡ µÈ´Ù. ¸¸¾à ´Ù¸¥ ´Ù¸¥ ÇÁ·Î¼¼½ºÀÇ ¸Þ¸ð¸® ¿µ¿ªÀ» ħ¹üÇÏ·Á°í Çϸé Ä¿³ÎÀº ħ¹ü ÇÁ·Î¼¼½º¿¡ SIGSEGV °æ°í ½Ã±×³ÎÀ» º¸³»°Ô µÈ´Ù.
´Ù¼öÀÇ ÇÁ·Î¼¼½º°¡ µ¿½Ã¿¡ ÀÛµ¿ÇÏ´Â linux ¿î¿µÃ¼Á¦ÀÇ Æ¯¼º»ó ÇÁ·Î¼¼½ºÀÇ ¸Þ¸ð¸®¿µ¿ªÀº ¹Ýµå½Ã º¸È£µÇ¾î¾ß ÇÒ°ÍÀÌ´Ù. ±×·¸Áö¸¸ ¸Þ¸ð¸®¿µ¿ª¿¡ ÀÖ´Â µ¥ÀÌÅ͸¦ ´Ù¸¥ ÇÁ·Î¼¼½ºµµ »ç¿ëÇÒ ¼ö ÀÖµµ·Ï ÇØ¾ßÇÒ °æ¿ìµµ ÀÖÀ» °ÍÀÌ´Ù. ¹°·Ð pipeµîÀ» ÀÌ¿ëÇØ¼ µ¥ÀÌÅÍ Åë½ÅÀ» ÀÌ¿ëÇØ¼ µ¥ÀÌÅ͸¦ Àü´ÞÇÏ´Â ¹æ¹ýµµ ÀÖ°ÚÁö¸¸ thread¿¡¼ ó·³ ¸Þ¸ð¸®¿µ¿ªÀ» °øÀ¯ÇÑ´Ù¸é ´õ ÆíÇÏ°Ô µ¥ÀÌÅ͸¦ ÇÔ²² »ç¿ëÇÒ ¼ö ÀÖÀ» °ÍÀÌ´Ù.
°øÀ¯¸Þ¸ð¸®´Â ÇÁ·Î¼¼½º°£ ¸Þ¸ð¸® ¿µ¿ªÀ» °øÀ¯Çؼ »ç¿ëÇÒ ¼ö ÀÖµµ·Ï Çã¿ëÇÑ´Ù. ÇÁ·Î¼¼½º°¡ °øÀ¯¸Þ¸ð¸® ÇÒ´çÀ» Ä¿³Î¿¡ ¿äûÇϸé Ä¿³ÎÀº ÇØ´ç ÇÁ·Î¼¼½º¿¡ ¸Þ¸ð¸® °ø°£À» ÇÒ´çÇÑ´Ù. ÀÌÈÄ ¾î¶² ÇÁ·Î¼¼½ºµçÁö ÇØ´ç ¸Þ¸ð¸®¿µ¿ª¿¡ Á¢±ÙÇÒ ¼ö ÀÖ´Ù.
°øÀ¯¸Þ¸ð¸®´Â Áß°³ÀÚ°¡ ¾øÀÌ °ð¹Ù·Î ¸Þ¸ð¸®¿¡ Á¢±ÙÇÒ ¼ö Àֱ⠶§¹®¿¡ ´Ù¸¥ ¸ðµç IPCµé Áß¿¡¼ °¡Àå ºü¸£°Ô ÀÛµ¿ÇÑ´Ù. 2.4.1 °øÀ¯¸Þ¸ð¸® ÇÔ¼öµé
°øÀ¯¸Þ¸ð¸®´Â °ø°£Àº Ä¿³ÎÀÌ °ü¸®ÇÑ´Ù. ±×·¯¹Ç·Î ÇÁ·Î¼¼½º°¡ Á¾·áµÇ¸é ¹ÝȯµÇ´Â ¸Þ¸ð¸®¿µ¿ª°ú´Â ´Þ¸® »ý¼±ÇÑ ÇÁ·Î¼¼½º°¡ Á¾·áÇÏ´õ¶óµµ °øÀ¯¸Þ¸ð¸®´Â ±×´ë·Î ³²¾ÆÀÖ°Ô µÈ´Ù.
°øÀ¯¸Þ¸ð¸®´Â ´ÙÀ½°ú °°Àº °úÁ¤À» °ÅÃļ »ç¿ëÇÑ´Ù.
#include <sys/types.h> #include <sys/shm.h> int shmget(key_t key, int size, int shmflg) void *shmat( int shmid, const void *shmaddr, int shmflg ) int shmdt( const void *shmaddr) int shmctl(int shmid, int cmd, struct shmid_ds *buf)shmget : ÀÌ ÇÔ¼ö¸¦ ÀÌ¿ëÇØ¼ °øÀ¯¸Þ¸ð¸®°øÀÇ »ý¼ºÀ» ¿äûÇÒ ¼ö ÀÖ´Ù.
shmctl : °øÀ¯¸Þ¸ð¸® ¿µ¿ªÀ» Á¦¾îÇϱâ À§Çؼ »ç¿ëÇÑ´Ù. °øÀ¯¸Þ¸ð¸®¸¦ »èÁ¦Çϰųª Àá±ÝÀÇ ¼³Á¤ ÇØÁ¦ ȤÀº ±ÇÇÑÀ» º¯°æÇϱâ À§ÇÑ ¸ñÀûÀ¸·Î »ç¿ëÇÒ ¼ö ÀÖ´Ù. µÎ¹øÂ° ÀÎÀÚÀÎ cmd¸¦ ÀÌ¿ëÇØ¼ ¿øÇÏ´Â ÀÛ¾÷À» ³»¸± ¼ö ÀÖ´Ù.
2.4.2 °øÀ¯¸Þ¸ð¸® ´Ù·ç±â
ÀÌÁ¦ °øÀ¯¸Þ¸ð¸®¸¦ ÀÌ¿ëÇØ¼ µ¥ÀÌÅ͸¦ °øÀ¯ÇÏ´Â °£´ÜÇÑ ÇÁ·Î±×·¥À» ¸¸µé¾îº¸µµ·Ï ÇϰڴÙ. ¿ì¼± check_process.c¶ó´Â ÇÁ·Î±×·¥À» Çϳª ¸¸µé °ÍÀÌ´Ù. ÀÌ ÇÁ·Î±×·¥Àº ÇöÀç ½Ã½ºÅÛ¿¡¼ ½ÇÇàÁßÀÎ ÇÁ·Î¼¼½ºÀÇ °¹¼ö¸¦ 1ÃÊ´ÜÀ§·Î °è»êÇØ¼ °øÀ¯¸Þ¸ð¸® ¿µ¿ª¿¡ ¾²´Â ÀÏÀ» ÇÑ´Ù. ´ÙÀ½À¸·Î get_process_num.cÀ̶ó´Â ÇÁ·Î±×·¥À» ¸¸µé °Çµ¥, ÀÌ ÇÁ·Î±×·¥Àº °øÀ¯¸Þ¸ð¸® ¿µ¿ª¿¡ Á¢±ÙÇØ¼ ½ÇÇàÁßÀÎ ÇÁ·Î¼¼½ºÀÇ °¹¼ö¸¦ ¾ò¾î¿Í¼ ȸ鿡 Ãâ·ÂÇÏ´Â ÀÏÀ» ÇÑ´Ù.
ÇÁ·Î¼¼½ºÀÇ °¹¼ö´Â popen(3)ÇÔ¼ö¸¦ ÀÌ¿ëÇØ¼, ps(1)¸¦ ½ÇÇà½ÃŲ ´ÙÀ½ ¶óÀμö¸¦ °è»êÇØ¼ ¾ò¾î¿Àµµ·Ï ÇϰڴÙ. ÇÁ·Î¼¼½º °¹¼ö´Â procÆÄÀϽýºÅÛÀ» ÀÌ¿ëÇØ¼ ¾ò¾î¿Ã ¼öµµ ÀÖ°ÚÁö¸¸ ¾ÆÁ÷ proc¸¦ ´Ù·çÁö ¾ÊÀº°ü°è·Î °£´ÜÇÑ popenÀ» ÀÌ¿ëÇϱâ·Î Çß´Ù. 001 #include <sys/ipc.h> 002 #include <sys/shm.h> 003 #include <string.h> 004 #include <unistd.h> 005 #include <stdlib.h> 006 #include <stdio.h> 007 008 int main(int argc, char **argv) 009 { 010 int shmid; 011 void *shared_memory = (void *)0; 012 FILE *fp; 013 char buff[1024]; 014 int skey = 5678; 015 016 int *process_num; 017 int local_num; 018 019 // °øÀ¯¸Þ¸ð¸® °ø°£À» ¸¸µç´Ù. 020 shmid = shmget((key_t)skey, sizeof(int), 0666|IPC_CREAT); 021 if(shmid == -1) 022 { 023 perror("shmget failed : "); 024 exit(0); 025 } 026 027 // ipcs(s)¸¦ ÀÌ¿ëÇØ¼ È®ÀÎÇϱâ À§ÇÔ. 028 printf("Key %x\n", skey); 029 030 // °øÀ¯¸Þ¸ð¸®¸¦ ¸ÊÇÎÇÑ´Ù. 031 shared_memory = shmat(shmid, (void *)0, 0); 032 if(!shared_memory) 033 { 034 perror("shmat failed : "); 035 exit(0); 036 } 037 038 process_num = (int *)shared_memory; 039 040 for (;;) 041 { 042 local_num = 0; 043 fp = popen("ps axh", "r"); 044 if(fp != NULL) 045 { 046 while(fgets(buff,1024, fp)) 047 { 048 local_num++; 049 } 050 } 051 *process_num = local_num; 052 printf("process_num is %d\n", (int)*process_num); 053 sleep(5); 054 pclose(fp); 055 } 056 } 057
20 shmget À» ÀÌ¿ëÇØ¼ °øÀ¯¸Þ¸ð¸® °ø°£À» »ý¼ºÇß´Ù. key ¹øÈ£´Â 5678·Î Çß´Ù.
ÀÌÁ¦ °øÀ¯¸Þ¸ð¸® °ø°£¿¡ Á¢±ÙÇØ¼ ÇÁ·Î¼¼½ºÀÇ °¹¼ö¸¦ Àоî¿À´Â ÇÁ·Î±×·¥À» ¸¸µé¾î º¸µµ·Ï ÇϰڴÙ. ÀÌ ÇÁ·Î±×·¥ÀÇ À̸§Àº read_process_num.c ·Î ÇϰڴÙ.28 skey¸¦ 16Áø¼ö·Î Ç¥½ÃÇß´Ù. ¸®´ª½º´Â ipcs(1)¶ó´Â ipc °ü¸® ÇÁ·Î±×·¥À» Á¦°øÇϴµ¥, ¿©±â¿¡¼´Â key ¹øÈ£°¡ 16Áø¼ö·Î Ç¥½ÃµÇ±â ¶§¹®¿¡ È®ÀÎÀ» ½±µµ·Ï Çϱâ À§ÇÔÀÌ´Ù. 31 shmat¸¦ ÀÌ¿ëÇØ¼ °øÀ¯¸Þ¸ð¸®¸¦ ¸ÊÇÎÇÑ´Ù. 40 ~ 50 popen(3)À» ÀÌ¿ëÇØ¼ ps(1)¸¦ ½ÇÇà½Ã۰í, ¶óÀμö¸¦ °è»êÇß´Ù. ¶óÀμö°¡ ÇÁ·Î¼¼½ºÀÇ °¹¼öÀÌ´Ù. ÇÁ·Î¼¼½ºÀÇ °¹¼ö´Â °øÀ¯¸Þ¸ð¸® °ø°£¿¡ ÀúÀåÇÑ´Ù. ÀÌÁ¦ ´Ù¸¥ ÇÁ·Î¼¼½º¿¡¼ °øÀ¯¸Þ¸ð¸® °ø°£¿¡ Á¢±ÙÇØ¼ ÇÁ·Î¼¼½ºÀÇ °¹¼ö¸¦ ¾ò¾î¿Ã ¼ö ÀÖ°Ô µÇ¾ú´Ù. 001 #include <sys/ipc.h> 002 #include <sys/shm.h> 003 #include <string.h> 004 #include <unistd.h> 005 #include <stdlib.h> 006 #include <stdio.h> 007 008 int main(int argc, char **argv) 009 { 010 int shmid; 011 int skey = 5678; 012 013 int *shared_memory; 014 015 shmid = shmget((key_t)skey, sizeof(int), 0666); 016 if(shmid == -1) 017 { 018 perror("shmget failed\n"); 019 exit(0); 020 } 021 022 shared_memory = shmat(shmid, (void *)0, 0); 023 if(!shared_memory) 024 { 025 perror("shmat failed : "); 026 exit(0); 027 } 028 printf("shm id : %d\n", shmid); 029 while(1) 030 { 031 int num = *shared_memory; 032 printf("Process Num : %d\n", num); 033 sleep(1); 034 } 035 } 036
2.4.3 ÀåÁ¡°ú ÇѰè
°øÀ¯¸Þ¸ð¸®´Â ºñ±³Àû °£´ÜÇÏ°Ô »ç¿ëÇÒ ¼ö ÀÖ´Ù. ¶ÇÇÑ Ä¿³Î¸Þ¸ð¸®¿µ¿ª¿¡¼ °ü¸®Çϱ⠶§¹®¿¡ ¸Å¿ì ºü¸£°Ô Á¢±Ù°¡´ÉÇÏ´Ù´Â ÀåÁ¡µµ °¡Áø´Ù. ±×·¯³ª Ä¿³Î¼³Á¤¿¡ Á¾¼ÓÀûÀ̱⠶§¹®¿¡, »ç¿ëÇϱâÀü¿¡ Ä¿³Î¿¡¼ Çã¿ëÇϰí ÀÖ´Â °øÀ¯¸Þ¸ð¸® ¼¼±×¸ÕÆ®ÀÇ Å©±â¸¦ È®ÀÎÇØ¾ß ÇÑ´Ù.
ÀϹÝÀûÀ¸·Î ¸®´ª½ºÄ¿³ÎÀÇ ÃʱⰪÀº 32MB·Î ÀâÇôÀÖ´Ù. »ó´çÈ÷ ÀÛÀº Å©±âÀε¥, ´ÙÇàÀÌ 2.6 ÀÌ»óÀÇ Ä¿³Î¿¡¼´Â ´ÜÀÏ °øÀ¯¸Þ¸ð¸® ¼¼±×¸ÕÆ®ÀÇ Å©±â¸¦ 1GB±îÁö »ç¿ëÇÒ ¼ö ÀÖµµ·Ï Áö¿øµÇ°í ÀÖ´Ù. 1GB¸é ¿Ø¸¸ÇÑ ¾ÖÇø®ÄÉÀ̼ÇÀ» ´Ù·ç´Âµ¥¿¡´Â Å« ¹®Á¦ ¾øÀ» °ÍÀ¸·Î »ý°¢µÈ´Ù.
°øÀ¯¸Þ¸ð¸® ¼¼±×¸ÕÆ®ÀÇ Å©±â´Â /proc/sys/kernel/shmmax ¿¡¼ È®ÀÎÇÒ ¼ö ÀÖ´Ù. # cat shmmax 33554432´ÙÀ½°ú °°ÀÌ ¼¼±×¸ÕÆ®ÀÇ Å©±â¸¦ º¯°æÇÒ ¼ö ÀÖ´Ù. 512MB·Î È®ÀåÇÏ°í ½Í´Ù¸é, ¾Æ·¡¿Í °°ÀÌ ÆÄÀÏ¿¡ ½áÁֱ⸸ ÇÏ¸é µÈ´Ù. # echo "536870912" > /proc/sys/kernel/shmmax ȤÀº # echo "512*1024*1024" | bc(3) > /proc/sys/kernel/shmmax
°øÀ¯¸Þ¸ð¸®´Â ¸Þ½ÃÁö Àü´Þ ¹æ½ÄÀÌ ¾Æ´Ï±â ¶§¹®¿¡ µ¥ÀÌÅ͸¦ Àоî¾ßµÇ´Â ½ÃÁ¡À» ¾Ë ¼ö ¾ø´Ù´Â ´ÜÁ¡À» °¡Áø´Ù. ÀÌ ¹®Á¦¸¦ ÇØ°áÇÏ·Á¸é ´Ù¸¥ IPC ¼³ºñµéÀ» ÀÀ¿ëÇØ¾ß ÇÑ´Ù. 2.5 Memory Map
¸Þ¸ð¸®¸Êµµ °øÀ¯¸Þ¸ð¸® °ø°£°ú ¸¶Âù°¡Áö·Î ¸Þ¸ð¸®¸¦ °øÀ¯ÇÑ´Ù´Â Ãø¸é¿¡ À־ ¼·Î ºñ½ÁÇÑ Ãø¸éÀÌ ÀÖ´Ù. ´Ù¸¥Á¡Àº ¸Þ¸ð¸®¸ÊÀÇ °æ¿ì ¿¸°ÆÄÀÏÀ» ¸Þ¸ð¸®¿¡ ¸ÊÇνÃÄѼ, °øÀ¯ÇÑ´Ù´Â Á¡ÀÏ °ÍÀÌ´Ù. ÆÄÀÏÀº ½Ã½ºÅÛÀü¿ªÀûÀÎ ÀÚ¿øÀÌ´Ï ¼·Î ´Ù¸¥ ÇÁ·Î¼¼½ºµé³¢¸® µ¥ÀÌÅ͸¦ °øÀ¯Çϴµ¥ ¹®Á¦°¡ ¾øÀ» °ÍÀÓÀ» ¿¹»óÇÒ ¼ö ÀÖ´Ù.
¸Þ¸ð¸®¸ÊÀ¸·Î ÇÒ ¼ö ÀÖ´Â ÀϵéÀº ´ÙÀ½°ú °°´Ù. 2.5.1 Memory map »ý¼º°ú »èÁ¦
¸®´ª½º´Â mmap(2)¶ó´Â ½Ã½ºÅÛ ÇÔ¼ö¸¦ Á¦°ø ÇÑ´Ù. ÀÌ ÇÔ¼ö¸¦ ÀÌ¿ëÇØ¼, ¿·ÁÁø ÆÄÀÏÀ» ¸Þ¸ð¸®¿¡ ¸ÊÇνÃų ¼ö ÀÖ´Ù. #include <sys/mman.h>
void *mmap(void *addr, size_t length, int prot, int flags,
int fd, off_t offset);
2.5.2 ¿¹Á¦ : »ý»êÀÚ
°£´ÜÇÑ ¿¹Á¦ ÇÁ·Î±×·¥À» ¸¸µé¾î º¸±â·Î Çß´Ù. ÀÌ ÇÁ·Î±×·¥Àº mymmap.mmÀ̶ó´Â ÆÄÀÏÀ» ¸¸µé°í ¸Þ¸ð¸®¿¡ ´ëÀÀ½ÃŲ´Ù. ´ëÀÀ½ÃŲ ¸Þ¸ð¸®¿¡´Â intÇü µ¥ÀÌÅ͸¦ ¾´´Ù. 001 #include <stdio.h> 002 #include <stdlib.h> 003 #include <string.h> 004 #include <unistd.h> 005 #include <fcntl.h> 006 #include <sys/mman.h> 007 008 int main() 009 { 010 int fd; 011 int *pmmap; 012 int i; 013 fd = open("mymmap.mm", O_RDWR|O_CREAT, 0666); 014 if(fd < 0) 015 { 016 perror("open"); 017 exit(1); 018 } 019 ftruncate(fd, 4096); 020 021 pmmap = (int *)mmap(0, 4096, PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0); 022 if((unsigned)pmmap == (unsigned)-1) 023 { 024 perror("mmap"); 025 exit(1); 026 } 027 028 for(i = 0; i < 100; i++) 029 { 030 pmmap[i] = i*i; 031 } 032 pmmap[i+1] = -1; 033 getchar(); 034 munmap(pmmap, 4096); 035 close(fd); 036 return 0; 037 } 038
2.5.3 ¿¹Á¦ : ¼ÒºñÀÚ
ÀÌ ÇÁ·Î±×·¥Àº À§¿¡¼ ¸¸µé¾îÁø ¸Þ¸ð¸®¸Ê ÆÄÀÏÀÇ µ¥ÀÌÅ͸¦ Àоî¿À´Â ÀÏÀ» ÇÑ´Ù. 001 #include <sys/stat.h> 002 #include <sys/mman.h> 003 #include <unistd.h> 004 #include <stdlib.h> 005 #include <fcntl.h> 006 007 int main(int argc, char **argv) 008 { 009 int fd; 010 int i=0; 011 char *file = NULL; 012 char *linebuf; 013 int *maped; 014 int flag = PROT_WRITE | PROT_READ; 015 016 if ((fd = open("mymmap.mm", O_RDWR, 0666)) < 0) 017 { 018 perror("File Open Error"); 019 exit(1); 020 } 021 022 // mmap¸¦ ÀÌ¿ëÇØ¼ ¿¸° ÆÄÀÏÀ» ¸Þ¸ð¸®¿¡ ´ëÀÀ½ÃŲ´Ù. 023 // fileÀº ´ëÀÀµÈ ÁÖ¼Ò¸¦ °¡¸®Å°°í, fileÀ» ÀÌ¿ëÇØ¼ ÇÊ¿äÇÑ ÀÛ¾÷À» 024 // ÇÏ¸é µÈ´Ù. 025 if ((maped = 026 (int *) mmap(0, 4096, flag, MAP_SHARED, fd, 0)) == -1) 027 { 028 perror("mmap error"); 029 exit(1); 030 } 031 032 while(1) 033 { 034 if (maped[i] == -1) break; 035 printf("> %d\n",maped[i]); 036 i++; 037 } 038 close(fd); 039 } 040
2.5.4 ¸Þ¸ð¸® ¸ÊÀÇ ÀåÁ¡
¸Þ¸ð¸®¸ÊÀº ÆÄÀÏÀ» ¸Þ¸ð¸®¿¡ ´ëÀÀ½ÃÅ´À¸·Î½á, ÇÁ·Î¼¼½º°£ ¸Þ¸ð¸®¸¦ ¼·Î °øÀ¯ÇÒ ¼ö ÀÖ´Ù´Â IPC·Î¼ÀÇ ÀåÁ¡À» °¡Áø´Ù´Â °ÍÀ» ¾Ë ¼ö ÀÖ´Ù. À̿ܿ¡ ¶Ç´Ù¸¥ ÀåÁ¡ÀÌ Àִµ¥, ÆÄÀÏ ÀÔÃâ·Â¿¡¼ÀÇ ºñ¿ëÀ» ÁÙÀÏ ¼ö ÀÖ´Ù´Â Á¡ÀÌ´Ù. ÆÄÀÏ¿¡¼ÀÇ ÀÛ¾÷Àº open(2), read(2), write(2), lseek(2)¿Í °°Àº »ó´çÇÑ ºñ¿ëÀ» ÁöºÒÇÏ´Â ÇÔ¼ö¸¦ ÅëÇØ¼ ÀÌ·ç¾îÁø´Ù. ¸Å¸ð¸® ¸ÊÀ» ÀÌ¿ëÇϸé ÀÌ·¯ÇÑ ºñ¿ëÀ» ÁÙÀÏ ¼ö ÀÖ´Ù.
¶ÇÇϳªÀÇ ÀåÁ¡Àº ¸Þ¸ð¸®ÀÇ ³»¿ëÀ» ÆÄÀÏ·Î ³²±æ ¼ö ÀÖ´Ù´Â Á¡ÀÌ´Ù. ¸Þ¸ð¸®ÀÇ ³»¿ëÀº Èֹ߼ºÀ¸·Î ÇÁ·Î¼¼½º°¡ Á¾·áµÇ¸é Áõ¹ßÇÏ°Ô µÈ´Ù. º¸Åë ¸Þ¸ð¸®ÀÇ Á¤º¸¸¦ ³²°Ü¾ßÇÒ Çʿ䰡 »ý±â¸é ÇÁ·Î¼¼½ºÀÇ Á¾·áÀü¿¡ ÆÄÀÏ·Î ³²±â´Âµ¥, ¸Þ¸ð¸®¸ÊÀÇ °æ¿ì ÆÄÀÏ·Î ´ëÀÀµÇ±â ¶§¹®¿¡, ºñ±³Àû ¾ÈÀüÇÏ°Ô Á¤º¸¸¦ ³²±æ ¼ö ÀÖ´Ù´Â ÀåÁ¡µµ °¡Áø´Ù. 2.6 ¼¼¸¶Æ÷¾î - Semaphore
¼¼¸¶Æ÷¾î´Â ÀüÅëÀûÀÎ IPC ¼³ºñÀÇ Çϳª·Î Á¦°øµÇ±â´Â ÇÏÁö¸¸ ´Ù¸¥ IPC ¼³ºñ¿Í´Â ¾à°£ ´Ù¸¥ Ư¡À» °¡Áø´Ù. ´Ù¸¥ IPC ¼³ºñµéÀº ¸ðµÎ°¡ µ¥ÀÌÅ͸¦ °øÀ¯Çϱâ À§ÇÑ Æ¯Â¡À» °¡Áö´Âµ¥ ¹ÝÇØ¼ ¼¼¸¶Æ÷¾î´Â ÀÚ¿ø¿¡ ´ëÇÑ Á¢±ÙÀ» Á¦¾îÇϱâ À§ÇÑ ¸ñÀûÀ¸·Î »ç¿ëµÈ´Ù. ¼¼¸¶Æ÷¾î ±× ÀÚü°¡ µ¥ÀÌÅ͸¦ °øÀ¯Çϱâ À§ÇÑ ¾î¶² °ø°£À» Á¦°øÇÏÁö´Â ¾Ê´Â´Ù´Â ¾ê±â´Ù. ´ë°ÔÀÇ °æ¿ì¿¡´Â ´Ù¸¥ IPC¼³ºñ¸¦ Áö¿øÇϱâ À§ÇÑ ÀÌÀ¯·Î »ç¿ëµÈ´Ù.
¸Å¸ð¸®¸ÊÀ» ¿¹·Î µé¾îº¸ÀÚ. ¿©·¯°³ÀÇ ÇÁ·Î¼¼½º°¡ ÇϳªÀÇ ¸Þ¸ð¸®¸Ê¿¡ ¿¢¼¼½º¸¦ ÇÑ´Ù¸é, ¸Þ¸ð¸®¸Ê¿¡ Çѹø¿¡ Çϳª¾¿ÀÇ ÇÁ·Î¼¼½º¸¸ Á¢±ÙÀÌ °¡´ÉÇϵµ·Ï Á¦¾îÇÒ Çʿ䰡 ÀÖÀ» °ÍÀÌ´Ù. ±×·¸Áö ¾Ê´Ù¸é ´ÙÀ½°ú °°Àº ¹®Á¦°¡ ¹ß»ýÇÒ ¼ö ÀÖ´Ù.
count ++ ÇÏ´Â ÇÁ·Î±×·¥
ÀÌ ¹®Á¦´Â ƯÁ¤ ¿µ¿ª¿¡ ´ÜÁö ÇϳªÀÇ ÇÁ·Î¼¼½º¸¸ ÁøÀÔ°¡´ÉÇϵµ·Ï ÇÏ´Â °ÍÀ¸·Î ÇØ°áÇÒ ¼ö ÀÖÀ» °ÍÀÌ´Ù.
count ++ ÇÏ´Â ÇÁ·Î±×·¥ : Á¢±ÙÁ¦¾î¸¦ ÇÑ ¹öÀü
2.6.1 ¼¼¸¶Æ÷¾îÀÇ ÀÛµ¿¿ø¸®
¼¼¸¶Æ÷¾î S´Â Á¤¼ö°ªÀ» °¡Áö´Â º¯¼ö¸ç, P¿Í V µÎ°³ÀÇ ¸í·É¿¡ ÀÇÇØ¼ Á¢±ÙÇÒ ¼ö ÀÖ´Ù. P´Â Å×½ºÆ®¸¦ À§ÇÑ ¸í·ÉÀ̸ç V´Â Áõ°¡¸¦ À§ÇÑ ¸í·ÉÀÌ´Ù.
ÁøÀÔÀ» Á¦ÇÑÇØ¾ß ÇÏ´Â ¿µ¿ªÀ» ÀӰ迵¿ªÀ̶ó°í Çϸé, P´Â ÀӰ豸¿ª¿¡ ÁøÀÔÇϱâ À§Çؼ ¼öÇàÀ̵ǰí, V´Â (ÀÛ¾÷À» ¸¶Ä¡°í)ÀӰ迵¿ª¿¡¼ ³ª¿Ã¶§ ¼öÇàµÈ´Ù. ´ç¿¬È÷ P¿Í V ¸í·ÉÀÇ ¼öÇàÀº ¿øÀÚ¼ºÀ» º¸ÀåÇØ¾ß ÇÑ´Ù. ÇϳªÀÇ ÇÁ·Î¼¼½º°¡ P¿Í V¸¦ ÀÌ¿ëÇØ¼ ¼¼¸¶Æ÷¾î °ªÀ» º¯°æÇÒ¶§, ´Ù¸¥ ÇÁ·Î¼¼½º°¡ ÀÌ °ªÀ» º¯°æÇÒ ¼ö ÀÖÀ¸¸é ¾ÈµÈ´Ù.
2.6.2 ¼¼¸¶Æ÷¾îÀÇ »ç¿ë
¼¼¸¶Æ÷¾î´Â 3°³ÀÇ ÇÔ¼ö¸¦ Á¦°øÇÑ´Ù. Áï
#include <sys/types.h> #include <sys/ipc.h> #include <sys/sem.h> int semget(key_t key, int nsems, int semflg); int semop (int semid, struct sembuf *sops, unsigned nsops); int semctl(int semid, int semnum, int cmd, union semun arg);
¼¼¸¶Æ÷¾î´Â Ä¿³ÎÀÌ °ü¸®ÇÑ´Ù. semgetÀ» ÀÌ¿ëÇØ¼ Ä¿³Î¿¡ ¼¼¸¶Æ÷¾îÀÇ »ý¼º ȤÀº ±âÁ¸¿¡ ¸¸µé¾îÁø ¼¼¸¶Æ÷¾îÀÇ Á¢±ÙÀ» ¿äûÇÒ ¼ö ÀÖ´Ù. semgetÀÇ ÀÎÀÚ´Â ´ÙÀ½°ú °°´Ù.
2.6.3 ¼¼¸¶Æ÷¾î ¿¹Á¦ ÇÁ·Î±×·¥#include <unistd.h> #include <stdlib.h> #include <string.h> #include <pthread.h> #include <sys/types.h> #include <sys/sem.h> #include <sys/ipc.h> #include <stdio.h> #define MAX_THREAD 2 int count = 0; void *myThreadFunc(void *data); struct sembuf mysem_open = {0, -1, SEM_UNDO}; struct sembuf mysem_close = {0, 1, SEM_UNDO}; union snum { int val; }; static int semid; int main(int argc, char **argv) { int thr_id; int status; int i; union snum s_union; pthread_t pt[MAX_THREAD]; semid = semget(2345, 1, 0600|IPC_CREAT); if(semid == -1) { perror("semget error"); return 1; } s_union.val = 1; if(semctl(semid, 0, SETVAL, s_union) == -1) { return 1; } for(i = 0; i < MAX_THREAD; i++) { thr_id = pthread_create(&pt[i], NULL, myThreadFunc, (void *)&i); if(thr_id < 0) { perror("Thread Create Error"); return 1; } sleep(1); } for(i = 0; i < MAX_THREAD; i++) { pthread_join(pt[i], NULL); } } void *myThreadFunc(void *data) { int thread_num = *(int *)data; int lnum; printf("Thread Create %d\n", thread_num); while(1) { semop(semid, &mysem_open, 1); lnum = count; sleep(1); lnum = lnum+1; count = lnum; printf("[%d] count : %d\n", thread_num, count); semop(semid, &mysem_close, 1); } }ÀÌ ÇÁ·Î±×·¥Àº Ä«¿îÆÃ ÇÁ·Î±×·¥ÀÌ´Ù. µÎ °³ÀÇ ½º·¹µå°¡ ÇϳªÀÇ count º¯¼ö¿¡ Á¢±ÙÇϴµ¥, ¼¼¸¶Æ÷¾î¸¦ ÀÌ¿ëÇØ¼ Á¢±ÙÀ» Á¦¾îÇϰí ÀÖ´Ù. ½º·¹µå ÇÔ¼öÀÎ myThreadFunc¿¡¼ semop ºÎºÐÀ» ÁÖ¼® ó¸®ÇÑ ÈÄ ¾î¶² °á°ú°¡ ³ª¿À´ÂÁö È®ÀÎÇØ º¸µµ·Ï ÇÏÀÚ. 2.6.4 ¼¼¸¶Æ÷¾îÀÇ ÀåÁ¡°ú ´ÜÁ¡
¼¼¸¶Æ÷¾î´Â º¯¼öÀÇ °ªÀ» È®ÀÎÇØ¼ ÀӰ迵¿ªÀ¸·ÎÀÇ ÁøÀÔÀ» Á¦¾îÇÑ´Ù. ±×·¸´Ù¸é ÇÁ·Î±×·¥º¯¼ö·Îµµ ÀӰ迵¿ªÀÇ ÁøÀÔÀ» Á¦¾îÇÒ ¼ö ÀÖÀ» °ÍÀÌ´Ù. ´ë·« ´ÙÀ½°ú °°´Ù. P(S)
{
while (S <= 0)
continue;
S--;
}
/* ÀӰ迵¿ª */
V(S)
{
S++;
}
¸Å¿ì °£´ÜÇÑ ±¸ÇöÀ¸·Î º¸ÀÌÁö¸¸, À̹æ¹ýÀ» ÀÌ¿ëÇÏ°Ô µÉ °æ¿ì ÇÁ·Î¼¼½º°¡ busy wait »óÅ¿¡ ³õÀ̱⠵ȴÙ. ¶ÇÇÑ ´Ù¸¥ ÇÁ·Î¼¼½ºµé°£¿¡´Â »ç¿ëÇϱâ Èûµé´Ù´Â ¹®Á¦Á¡µµ °¡Áø´Ù. ¹Ý¸é ¼¼¸¶Æ÷¾î´Â
¼¼¸¶Æ÷¾î¸¦ Á¦¾îÇϱâ À§Çؼ´Â PÇÔ¼ö¿Í VÇÔ¼ö¸¦ »ç¿ëÇØ¾ß Çϴµ¥, ÀÌ µÎ°³ÀÇ ÇÔ¼ö´Â µ¶¸³ÀûÀÌ´Ù. ¶§¹®¿¡ À߸ø»ç¿ëÇÏ°Ô µÉ°æ¿ì deadlock¿¡ ºüÁú ¼ö ÀÖ´Ù. 2.7 Socket
Socket´Â ¹°¸®ÀûÀ¸·Î ¸Ö¸® ¶³¾îÁ® ÀÖ´Â ÄÄÇ»Åͳ¢¸®ÀÇ Åë½ÅÀ» µµ¿ÍÁÖ±â À§ÇÑ Åë½Å°èÃþÀÌ´Ù. SocketÀº ¿ø°ÝÅë½ÅÀ» À§ÇÑ ¿©·¯°¡Áö ÇÔ¼öµéÀ» Á¦°øÇϴµ¥, À̵éÀ» ÀÌ¿ëÇØ¼ ¹°¸®ÀûÀ¸·Î ¶³¾îÁø ÄÄÇ»ÅÍ °£ÀÇ Åë½ÅÀÌ °¡´ÉÇÏ°Ô µÈ´Ù. ÀÎÅͳÝÀ» ÀÌ¿ëÇÑ Åë½Å ÇÁ·Î±×·¥ÀÇ ´ëºÎºÐÀÌ socket ±â¹ÝÀ¸·Î ÀÛ¼ºµÈ´Ù°í º¸¸é Ʋ¸²¾øÀ» °ÍÀÌ´Ù.
ÄÄÇ»ÅÍ¿Í ÄÄÇ»ÅͰ£ÀÇ Åë½ÅÀ̶ó°í´Â ÇÏÁö¸¸ ½ÇÁúÀûÀ¸·Î´Â ÀÌÂÊ ÄÄÇ»ÅÍÀÇ ÇÁ·Î¼¼½º¿Í ÀúÂÊ ÄÄÇ»ÅÍÀÇ ÇÁ·Î¼¼½º°¡ Åë½ÅÀ» ÇÏ´Â °Í´Ù. ÀÌ·¸°Ô ÇÁ·Î¼¼½º°£ Åë½ÅÀ» ÇÑ´Ù´Â Á¡¿¡¼ ºÃÀ» ¶§ IPC¼³ºñ¿Í ±Ùº»ÀûÀ¸·Î ´Ù¸¥Á¡Àº ¾ø´Ù°í º¼ ¼ö ÀÖ´Ù. Â÷ÀÌÁ¡À̶ó¸é Åë½ÅÀÌ ÀÌ·ç¾îÁö´Â ¿µ¿ªÀÌ ÄÄÇ»ÅÍ ³»ºÎÀÎÁö ¾Æ´Ï¸é ¿Â¶óÀÎÀÎÁö ÇÏ´Â °ÍÀÌµÉ °ÍÀÌ´Ù.
ºñ·Ï socketÀÌ ¿ø°ÝÀÇ ÄÄÇ»ÅÍ ÇÁ·Î¼¼½ºµé°£ÀÇ Åë½ÅÀ» À§ÇÑ µµ±¸ÀÌÁö¸¸ ÀÌ·¯ÇÑ ÇÁ·Î¼¼½º°£ Åë½ÅÀ̶ó´Â ºñ½ÁÇÑ Æ¯¼ºÀ¸·Î ³»ºÎ ÇÁ·Î¼¼½º°£ Åë½ÅÀ» À§ÇÑ ¹æ¹ýÀ» Á¦°øÇÑ´Ù. Áï ¿ÜºÎ ÇÁ·Î¼¼½º°£ Åë½ÅÀ¸·Î »ç¿ëÇÒ°ÇÁö ³»ºÎ ÇÁ·Î¼¼½º°£ Åë½ÅÀ¸·Î »ç¿ëÇÒ °ÇÁö¸¦ ¼±ÅÃÇÒ ¼ö ÀÖ°Ô²û Çϰí ÀÖ´Ù. socket´Â ´ÜÀÏ ÁÖÁ¦¸¸À¸·Îµµ Ã¥ÇѵαÇÀº ¸¸µé¾î³¾ ¼ö ÀÖ´Â ¹æ´ëÇÑ ¾çÀÌ´Ù. ¿©±â¿¡¼´Â socketÀÇ ±â´ÉÁß ³»ºÎ ÇÁ·Î¼¼½º°£ Åë½ÅÁö¿ø ±â´É¿¡ ´ëÇØ¼¸¸ ¾Ë¾Æº¸µµ·Ï ÇÒ °ÍÀÌ´Ù. 2.7.1 Unix Domain Socket ÀÇ ÀåÁ¡
Unix Domain Socket(ÀÌÇÏ ¼ÒÄÏ)ÀÇ °¡Àå Å« ÀåÁ¡Àº ³×Æ®¿öÅ© Åë½Å¿¡ »ç¿ëÇÏ´ø ±â¼úÀ» ±×´ë·Î »ç¿ëÇÒ ¼ö ÀÖ´Ù´Â Á¡ÀÏ °ÍÀÌ´Ù. ÄÚµùÀÇ Àϰü¼ºÀ» À¯ÁöÇÒ ¼ö ÀÖµµ·Ï µµ¿ÍÁØ´Ù. ¾òÀ» ¼ö ÀÖ´Â ÀåÁ¡Àº ´ÜÁö ÇÔ¼ö¸¦ ±×´ë·Î »ç¿ëÇÒ ¼ö ÀÖ´Ù´Â Á¡ ÀÌ»óÀÌ´Ù. ´Ù¼öÀÇ Å¬¶óÀÌ¾ðÆ®¸¦ µ¿½Ã¿¡ ó¸®Çϱâ À§ÇÑ ¹æ¹ý, ¸Þ½ÃÁö °ü¸®¸¦ À§ÇÑ ¹æ¹ýµî ³×Æ®¿öÅ© ÇÁ·Î±×·¡¹Ö¿¡¼ »ç¿ëÇÏ´ø ÀÀ¿ë±â¼úµé ¿ª½Ã ±×´ë·Î »ç¿ëÇÒ ¼ö ÀÖ´Ù´Â ÀåÁ¡À» °¡Áø´Ù.
¶ÇÇÑ ¼ÒÄÏÀº ´Ù¸¥ IPC ¼³ºñ¿Í´Â ´Þ¸® ²Ï³ª ³ôÀº ¼öÁØ¿¡¼ Ãß»óȰ¡ µÇ¾î ÀÖ¾î¼, Á»´õ Á÷°üÀûÀ¸·Î ÇÁ·Î±×·¥À» ÀÛ¼ºÇÒ ¼ö ÀÖ´Ù.
´Ù¸¥ IPC ¼³ºñ µéÀº ƯÁ¤¿ëµµ¿¡ ¸Âµµ·Ï Á¦ÀÛµÈ Ãø¸éÀÌ ÀÖ¾î¼, ¾î¶² °÷¿¡¼´Â È¿À²ÀûÀÌÁö¸¸ ¶Ç´Ù¸¥ °÷¿¡¼´Â ºñÈ¿À²ÀûÀ̰ųª ÄÄÇ»ÅÍÀÚ¿øÀÇ Á¦ÇÑÀ» ¸¹ÀÌ ¹Þ´Â´Ù°Å³ª ÇÏ´Â ´ÜÁ¡ÀÌ ÀÖ´Ù. ÀÌ¿¡ ºñÇØ¼ ¼ÒÄÏÀº ¸Å¿ì ¹ü¿ëÀûÀ¸·Î »ç¿ëÇÒ ¼ö ÀÖ´Ù. ¹°·Ð ¹ü¿ëÀûÀ¸·Î »ç¿ëÇÒ·Á¸é ±×¸¸Å »ý°¢ÇØ¾ß ÇÒ °ÍµéÀÌ Á»´õ ÀÖÀ» ¼ö ÀÖ±äÇÏ´Ù.
ÆÄÀÌÇÁ·Îµµ ÃæºÐÇÑ °£´ÜÇÑ ÇÁ·Î±×·¥¿¡ ¼ÒÄÏÀ» »ç¿ëÇÏ´Â °Ç ºñÈ¿À²ÀûÀ̱ä ÇÏÁö¸¸ ¾î´ÀÁ¤µµ ÀÌ»óÀÇ ±Ô¸ð°¡ µÈ´Ù¸é ¼ÒÄÏÀ» ÀÌ¿ëÇÏ´Â °É ÃßõÇÑ´Ù. 2.7.2 Unix Domain Socket ¿¹Á¦
ÀÌ ÇÁ·Î±×·¥Àº ¿¡ÄÚ¼¹ö/Ŭ¶óÀ̾ðÆ®ÀÇ IPC ¹öÀüÀÌ´Ù.
¸ÕÀú ¼¹ö ÇÁ·Î±×·¥ÀÌ´Ù.
#include <sys/types.h> #include <sys/stat.h> #include <sys/socket.h> #include <sys/un.h> #include <unistd.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #define MAXLINE 1024 int main(int argc, char **argv) { int server_sockfd, client_sockfd; int state, client_len; pid_t pid; FILE *fp; struct sockaddr_un clientaddr, serveraddr; char buf[MAXLINE]; if (argc != 2) { printf("Usage : %s [socket file name]\n", argv[0]); printf("¿¹ : %s /tmp/mysocket\n", argv[0]); exit(0); } if (access(argv[1], F_OK) == 0) { unlink(argv[1]); } // internet ±â¹ÝÀÇ ½ºÆ®¸² ¼ÒÄÏÀ» ¸¸µéµµ·Ï ÇÑ´Ù. client_len = sizeof(clientaddr); if ((server_sockfd = socket(AF_UNIX, SOCK_STREAM, 0)) < 0) { perror("socket error : "); exit(0); } bzero(&serveraddr, sizeof(serveraddr)); serveraddr.sun_family = AF_UNIX; strcpy(serveraddr.sun_path, argv[1]); state = bind(server_sockfd , (struct sockaddr *)&serveraddr, sizeof(serveraddr)); if (state == -1) { perror("bind error : "); exit(0); } state = listen(server_sockfd, 5); if (state == -1) { perror("listen error : "); exit(0); } while(1) { client_sockfd = accept(server_sockfd, (struct sockaddr *)&clientaddr, &client_len); pid = fork(); if (pid == 0) { if (client_sockfd == -1) { perror("Accept error : "); exit(0); } while(1) { memset(buf, 0x00, MAXLINE); if (read(client_sockfd, buf, MAXLINE) <= 0) { close(client_sockfd); exit(0); } write(client_sockfd, buf, strlen(buf)); } } } close(client_sockfd); }
´ÙÀ½Àº Ŭ¶óÀÌ¾ðÆ® ÇÁ·Î±×·¥ÀÌ´Ù.
#include <sys/types.h> #include <sys/stat.h> #include <sys/socket.h> #include <unistd.h> #include <sys/un.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #define MAXLINE 1024 int main(int argc, char **argv) { int client_len; int client_sockfd; FILE *fp_in; char buf_in[MAXLINE]; char buf_get[MAXLINE]; struct sockaddr_un clientaddr; if (argc != 2) { printf("Usage : %s [file_name]\n", argv[0]); printf("¿¹ : %s /tmp/mysocket\n", argv[0]); exit(0); } client_sockfd = socket(AF_UNIX, SOCK_STREAM, 0); if (client_sockfd == -1) { perror("error : "); exit(0); } bzero(&clientaddr, sizeof(clientaddr)); clientaddr.sun_family = AF_UNIX; strcpy(clientaddr.sun_path, argv[1]); client_len = sizeof(clientaddr); if (connect(client_sockfd, (struct sockaddr *)&clientaddr, client_len) < 0) { perror("Connect error: "); exit(0); } while(1) { memset(buf_in, 0x00, MAXLINE); memset(buf_get, 0x00, MAXLINE); printf("> "); fgets(buf_in, MAXLINE, stdin); write(client_sockfd, buf_in, strlen(buf_in)); read(client_sockfd, buf_get, MAXLINE); printf("-> %s", buf_get); } close(client_sockfd); exit(0); }
![]() |
|
|||||||||||||||||||||
|
EmailÀ» ±âÀÔÇϸé, ´ñ±ÛÀÌ ¸ÞÀÏ·Î Àü´ÞµË´Ï´Ù. |
|