ÃÑ ÆäÀÌÁö ¼ö : 3224
![]()
|
Facebook Joinc ±×·ì
Joinc QA »çÀÌÆ®
![]()
Tweet
joinc´Â Firefox¿Í chrome¿¡¼ Å×½ºÆ® Çß½À´Ï´Ù. IE¿¡¼´Â Å×À̺íÀÌ ±úÁö°Å³ª À̹ÌÁö°¡ º¸ÀÌÁö ¾ÊÀ» ¼ö ÀÖ½À´Ï´Ù. ƯÈ÷ ±¸±Û DocsÀ̹ÌÁöÀÇ °æ¿ì ¿¢¹Úó¸®µÉ ¼ö ÀÖ½À´Ï´Ù. socketpair()Àº ºñ±³Àû ´Ü¼øÇÑ ³»¿ëÀÌÁö¸¸ ±âÁ¸ IPC¿¡¼ »©¸Ô°í ´Ù·çÁö ¾Ê¾ÒÀ½À¸·Î º°µµ·Î ºÐ¸®Çؼ ´Ù·ç±â·Î Çß´Ù. ±âÁ¸¿¡ ´Ù·ç¾ú´ø IPC¿¡ ´ëÇÑ ³»¿ëµµ ´ã°í ÀÖÀ¸¹Ç·Î º¹½ÀÇÏ´Â Àǹ̿¡¼ õõÈ÷ Àо±â ¹Ù¶õ´Ù.
Áö±Ý±îÁö ºñ±³Àû ÃÖ½ÅÀ̶ó°í »ý°¢µÇ´Â SystemV IPC¿Í À¯´Ð½º Ãʱ⠺ÎÅÍ »ç¿ëµÈ ¿À·¡µÈ ¿ª»ç¸¦ °¡Áø FIFO(³×ÀÓµå ÆÄÀÌÇÁ), pipe±×¸®°í ¼ÒÄÏ·¹À̾¼ Á¦°øÇÏ´Â Unix Domain ¼ÒÄÏÀ» ÀÌ¿ëÇÑ ³»ºÎ ÇÁ·Î¼¼½º°£ Åë½Å¿¡ ´ëÇØ¼ ¾Ë¾Æº¸¾Ò´Ù.
¿©±â¿¡¼´Â À̵é IPC¿¡¼ Á¦¿ÜµÇ¾îÀÖ´ø socketpair(2)¿¡ ´ëÇØ¼ ¾Ë¾Æº¸µµ·Ï ÇϰڴÙ. 1 socketpairÀ» ÀÌ¿ëÇÑ IPC
À̹øÀå¿¡¼´Â socketpairÀ» ÀÌ¿ëÇÏ´Â ¹æ¹ý¿¡ ´ëÇØ¼ ¾Ë¾Æ º¼ °ÍÀÌ´Ù. socketpairÀº pipe¿Í FIFO¿Í ¸Å¿ì ºñ½ÁÇÑ ÀÏÀ» ¼öÇàÇϴµ¥, socketpairÀ» »ç¿ëÇÒ °æ¿ì ¾òÀ» ¼ö ÀÖ´Â ÀåÁ¡¿¡ ´ëÇØ¼µµ ¾Ë¾Æº¸µµ·Ï ÇÑ´Ù.
¸¶Áö¸·¿¡´Â °£´ÜÇÑ ¿¹Á¦¸¦ ¸¸µé¾î¼ ÀÌÇØ¸¦ µ½µµ·Ï ÇϰڴÙ. 1.1 pipe¿Í FIFOÀÇ ´ÜÁ¡
pipe¿Í FIFO´Â À¯´Ð½º Ãʱ⿡ ¸¸µé¾î Á®¼ Áö±Ý±îÁö »ç¿ëµÇ°í ÀÖ´Â ¿À·¡µÈ ¿ª»ç¸¦ ÀÚ¶ûÇÏ´Â IPC¼³ºñ´Ù. Simple is beautifuleÀÌ À¯´Ð½ºÀÇ Ã¶ÇÐÀÌ µÇµµ·Ï Çϴµ¥ °¡Àå Å« ¿ªÈ°À» ÇÑ ¼³ºñ¶ó°í ÇÒ ¼ö ÀÖ´Ù. °¢°¢ÀÇ ÇÁ·Î¼¼½º´Â ÇÊ¿äÇÑ Àϵ鸸À» ´ã´çÇϸç, º¹ÀâÇÑ ÀÏÀº °¢°¢ÀÇ ÇÁ·Î¼¼½ºÀÇ µ¥ÀÌÅ͸¦ ÆÄÀÌÇÁ·Î ¿¬°áÇØ¼ ÇØ°áÇÏ¿´´Ù.
ÀÌ·¸°Ô ÇØ¼ À¯´Ð½º´Â ÇÊ¿äÇÑ Àϸ¸´ã´çÇÏ´Â ¼ö¸¹Àº "ÀÛÀº" ÇÁ·Î¼¼½ºµéÀ» ÅëÇØ¼ È¿À²ÀûÀ¸·Î °ü¸® µÉ ¼ö ÀÖ°Ô µÈ´Ù. °¢°¢ÀÇ ÇÁ·Î¼¼½ºµéÀº ¹Ýµå½Ã ÇÊ¿äÇÑ ±â´É¸¸À» °¡Áö°í Àֱ⠶§¹®¿¡ ÁÖ¾îÁø ÀÏ¿¡ ´ëÇØ¼´Â ¸Å¿ì È¿À²ÀûÀ¸·Î ÀÛµ¿ÇÒ ¼ö ÀÖÀ¸¸ç, ¹®Á¦°¡ ¹ß»ýÇÒ È®·üµµ ¸Å¿ì Àû¾ú´Ù.
pipe¿Í FIFO´Â À¯´Ð½ºÀÇ ÀÌ·¯ÇÑ ÆÄÀÌÇÁ¸¦ Áö¿øÇÏ´Â È®½ÇÇÏ°íµµ °£´ÜÇÑ ¹æ¹ýÀÌ´Ù. °ÅÀÇ À¯ÀÏÇÑ ´ÜÁ¡À̶ó°í »ý°¢µÇ´Â °ÍÀº ´Ü¹æÇâÀÇ ¿¬°á¸¸À» Áö¿øÇÑ´Ù´Â Á¡ÀÌ´Ù. ¸¸¾à ºÎ¸ðÇÁ·Î¼¼½º¿¡¼ ÀÚ½Ä ÇÁ·Î¼¼½º¸¦ ¸¸µé°í À̸¦ pipe¸¦ ÅëÇØ¼ ¿¬°á Çß´Ù¸é ºÎ¸ð´Â Àбâ¿Í ¾²±âÁß Çϳª¸¸ °¡´ÉÇÏ°Ô µÈ´Ù. ÀڽĿª½Ã ¸¶Âù°¡Áö·Î ¸¸¾à ºÎ¸ð°¡ ¾²±â Àü¿ë À¸·Î ÆÄÀÌÇÁ¸¦ ¿¾ú´Ù¸é Àбâ Àü¿ëÀ¸·Î, ºÎ¸ð°¡ Àбâ Àü¿ëÀ¸·Î ÆÄÀÌÇÁ¸¦ ¿¾ú´Ù¸é ¾²±â Àü¿ëÀ¸·Î ¿¾î¾ß¸¸ ÇÑ´Ù.
pipeÀÇ ÀÌ·¯ÇÑ ´Ü¹æÇ⼺Àº ÇÁ·Î¼¼½º°£ ¾ç¹æÇâ Åë½ÅÀÌ Áö¿øµÇ¾î¾ß ÇÏ´Â °æ¿ì ¹®Á¦°¡ µÈ´Ù. ¹°·Ð pipe¸¦ 2¹ø »ç¿ëÇÔÀ¸·Î½á ÀÌ·¯ÇÑ ¹®Á¦¸¦ ÇØ°áÇÒ ¼ö ÀÖ±â´Â ÇÏÁö¸¸ Äڵ带 ÁöÀúºÐ ÇÏ°Ô ¸¸µç´Ù. FIFO¿ª½Ã ÀÌ¿Í ºñ½ÁÇÑ ¹®Á¦Á¡À» °¡Áö°í ÀÖ´Ù.
´ÙÀ½Àº pipe¸¦ ÀÌ¿ëÇØ¼ ÀÚ½Ä ÇÁ·Î¼¼½º¿Í ´ëÈÇÏ´Â °£´ÜÇÑ ¿¹Á¦ ÇÁ·Î±×·¥ÀÌ´Ù. ºÎ¸ð ÇÁ·Î¼¼½º´Â fork&exec¸¦ ÅëÇØ¼ ¿ÜºÎ ÇÁ·Î±×·¥À» ÀÚ½Ä ÇÁ·Î¼¼½º·Î ½ÇÇà½ÃŰ°í ´ëÈÇÏ°Ô µÉ °ÍÀÌ´Ù. #include <unistd.h> #include <stdlib.h> #include <string.h> int main() { int pp[2]; int pid; if (pipe(pp) < 0) { printf("pipe error:"); } pid = fork(); if (pid < 0) { perror("fork error"); exit(0); } if (pid == 0) { close(pp[1]); dup2(pp[0], 0); if(execl("/home/mycvs/test/pipe_cl", "pipe_cl", 0) < 0) { perror("execl error"); } } else if (pid > 0) { close(pp[0]); while(1) { sleep(1); printf("Write\n"); write(pp[1], (void *)&pid, sizeof(pid)); } } }ÀÌ ÇÁ·Î±×·¥Àº ºÎ¸ð ÇÁ·Î¼¼½º·Î ÀÚ½Ä ÇÁ·Î¼¼½º·Î pipe_clÀ» ½ÇÇà½ÃŲ´Ù. ½ÇÇà ½ÃŲ ÀÚ½Ä ÇÁ·Î¼¼½º¿ÍÀÇ Åë½ÅÀ» À§Çؼ pipe()¸¦ ÀÌ¿ëÇØ¼ ÆÄÀÌÇÁ¸¦ »ý¼ºÇÑ´Ù. ºÎ¸ð ÇÁ·Î¼¼½º¿¡¼ ÀÚ½Ä ÇÁ·Î¼¼½º·Î µ¥ÀÌÅ͸¦ ¾²±â À§Çؼ dup2(2)¸¦ ÀÌ¿ëÇØ¼ Àбâ Àü¿ë ÆÄÀÌÇÁ pp[0]À» 0(Ç¥ÁØÀÔ·Â)À¸·Î º¹»çÇß´Ù. ÀÌÁ¦ ºÎ¸ð ÇÁ·Î¼¼½º°¡ ¾²±â Àü¿ë ÆÄÀÌÇÁ pp[1]·Î µ¥ÀÌÅ͸¦ ¾²¸é ÀÌ µ¥ÀÌÅÍ´Â ÀÚ½Ä ÇÁ·Î¼¼½ºÀÇ Ç¥ÁØÀÔ·ÂÀ¸·Î Àü´ÞµÈ´Ù. ´ÙÀ½Àº ÀÚ½Ä ÇÁ·Î¼¼½º·Î ½ÇÇà½Ãų pipe_cl.c ÇÁ·Î±×·¥ÀÇ ¼Ò½º ÄÚµå´Ù. #include <unistd.h> int main() { int buf; while(1) { read(0, (void *)&buf, sizeof(buf)); printf("read %d\n", buf); } }
ºÎ¸ð ÇÁ·Î¼¼½º´Â ÀÚ½ÅÀÇ PID¸¦ ÀڽĿ¡°Ô Àü´ÞÇϰí ÀÚ½Ä ÇÁ·Î¼¼½º´Â ÀÌ PID¸¦ Ãâ·ÂÇÑ´Ù.
¸¸¾à À§ÀÇ ÇÁ·Î¼¼½ºµéÀÌ ½Ö¹æÇâÀ¸·Î - ¿¹¸¦ µé¾î ÀÚ½Ä ÇÁ·Î¼¼½º¿¡¼ ºÎ¸ð ÇÁ·Î¼¼½ºÀÇ PID¸¦ ¹Þ°í ÀÚ½ÅÀÇ PID¸¦ ºÎ¸ð ÇÁ·Î¼¼½º¿¡°Ô Àü´Þ ÇÏ´Â - Åë½ÅÇϱ⸦ ¿øÇÑ´Ù¸é pipe()¸¦ µÎ¹ø È£ÃâÇØ¼ ÀбâÀü¿ë°ú ¾²±âÀü¿ëÀÇ µÎ°³ÀÇ ÆÄÀÌÇÁ¸¦ »ý¼ºÇØ¾ß ÇÒ°ÍÀÌ´Ù. ¹¹ ¾î¶»°Ô º¸¸é ±×¸® º¹ÀâÇÏÁö ¾ÊÀº ÀÛ¾÷À̶ó°í »ý°¢ µÉ ¼ö ÀÖÁö¸¸ ¾Ö¸Å¸ðÈ£ÇÑ º¯¼ö¸í°ú ¸íÈ®ÇÏÁö ¾ÊÀº ÀÔÃâ·Â °ü°è ¶§¹®¿¡ ÁöÀúºÐÇÑ Äڵ尡 µÇ±â ½±´Ù. 1.2 socketpairÀÇ »ç¿ë
socketpair()¸¦ ÀÌ¿ëÇÏ¸é ¿¬°áµÈ ¼ÒÄÏÀÇ ½ÖÀ» »ý¼ºÇÑ´Ù. »ý¼ºµÈ ¼ÒÄÏ½Ö Áß Çϳª¸¦ ºÎ¸ð°¡ °¡Áö°í ´Ù¸¥ Çϳª¸¦ ÀڽĿ¡°Ô ³Ñ±â´Â ¹æ½ÄÀ¸·Î ¿¬°áÀ» ¸¸µé ¼ö ÀÖ´Ù. ¼ÒÄÏÀ̹ǷΠ´ç¿¬È÷ ÀüÀÌÁß Åë½ÅÀ» Áö¿øÇÏ°Ô µÈ´Ù.
#include <sys/types.h> #include <sys/socket.h> int socketpair(int d, int type, int protocol, int sv[2]);
#include <sys/types.h> #include <sys/socket.h> int main() { int sv[2]; int pid; int mynum = 1; // ¼ÒÄϽÖÀ» »ý¼ºÇÑ´Ù. if (socketpair(AF_UNIX, SOCK_STREAM, 0, sv) < 0) { perror("socketpair error"); exit(0); } pid = fork(); if (pid < 0) { perror("fork error"); exit(0); } // exec¸¦ ÀÌ¿ëÇØ¼ ÀÚ½ÄÇÁ·Î¼¼½º¸¦ »ý¼ºÇÑ´Ù. if( pid == 0) { // ¼ÒÄϽÖÁß Çϳª¸¦ Ç¥ÁØÀÔ·ÂÀ¸·Î º¹»çÇÑ´Ù. dup2(sv[0], 0); // »ç¿ëµÇÁö ¾Ê´Â ¼ÒÄÏÀ» ´Ý´Â´Ù. close(sv[1]); close(sv[0]); execl("/home/mycvs/test/pipe_cl", "pipe_cl", 0); } else if (pid > 0) { // ½îÄϽÖÁß »ç¿ëÇÏÁö ¾Ê´Â ¼ÒÄÏÀº ´Ý´Â´Ù. close(sv[0]); while(1) { write(sv[1], (void *)&mynum, sizeof(mynum)); sleep(1); read(sv[1], (void *)&mynum, sizeof(mynum)); printf("num is %d\n", mynum); } } } </screen> </para> <para> <emphasis>¿¹Á¦ : socketpair_cl.c</emphasis> <screen> #include <unistd.h> int main() { int buf; while(1) { // Ç¥ÁØÀÔ·ÂÀ¸·Î ºÎÅÍ °ªÀ» ÀÐ¾î µéÀ̰í // ++ÇÑµÚ ¾´´Ù. read(0, (void *)&buf, sizeof(buf)); buf++; write(0, (void *)&buf, sizeof(buf)); } } |
|
|
|
EmailÀ» ±âÀÔÇϸé, ´ñ±ÛÀÌ ¸ÞÀÏ·Î Àü´ÞµË´Ï´Ù. |
|