ÃÑ ÆäÀÌÁö ¼ö : 3224
![]()
|
Facebook Joinc ±×·ì
Joinc QA »çÀÌÆ®
![]()
Tweet
joinc´Â Firefox¿Í chrome¿¡¼ Å×½ºÆ® Çß½À´Ï´Ù. IE¿¡¼´Â Å×À̺íÀÌ ±úÁö°Å³ª À̹ÌÁö°¡ º¸ÀÌÁö ¾ÊÀ» ¼ö ÀÖ½À´Ï´Ù. ƯÈ÷ ±¸±Û DocsÀ̹ÌÁöÀÇ °æ¿ì ¿¢¹Úó¸®µÉ ¼ö ÀÖ½À´Ï´Ù. 1 ÇÁ·Î¼¼½º¿¡ ´ëÇØ¼
¸®´ª½º ¿î¿µÃ¼Á¦°¡ ÇÏ´Â °¡Àå Áß¿äÇÑ ÀÏÁßÀÇ Çϳª´Â ÇÁ·Î±×·¥À» ½ÇÇà½ÃŰ´Â °ÍÀÌ´Ù. ÇÁ·Î±×·¥Àº ÄÄÇ»ÅͰ¡ ÀÌÇØÇÒ ¼ö ÀÖ´Â ¸í·É¾îµé°ú ¸í·ÉÀ» ¼öÇàÇϱâ À§ÇÑ µ¥ÀÌÅ͸¦ Æ÷ÇÔÇÑ ½ÇÇà°¡´ÉÇÑ °´Ã¼´Ù. À̵é ÇÁ·Î±×·¥Àº Çϵåµð½ºÅ©¿Í °°Àº º¸Á¶±â¾ïÀåÄ¡¿¡ À§Ä¡Çϴµ¥ ½ÇÇàÇϸé, ¿î¿µÃ¼Á¦´Â À̵éÀ» ÀÐ¾î¼ ÁÖ±â¾ïÀåÄ¡¿¡ º¹»ç ÇÑ´Ù. ÇÁ·Î±×·¥ÀÌ º¹»çµÈ À̹ÌÁö°¡ ¿Ã¶ó°¡´Â °ÍÀ̶ó°í º¼ ¼ö Àִµ¥, ÀÌ·¯ÇÑ ÇÁ·Î±×·¥ÀÇ ½ÇÇà µÈ °´Ã¼¸¦ ÇÁ·Î¼¼½ºÈ¤Àº ÇÁ·Î±×·¥ÀÇ ½ÇÇà À̹ÌÁö¶ó°í ¸»ÇÑ´Ù.
ÀÌ·¸°Ô ÇÁ·Î±×·¥À» Á÷Á¢½ÇÇà½ÃŰÁö ¾Ê°í, ¸Þ¸ð¸®·Î À̹ÌÁö¸¦ Ä«ÇÇÇØ¼ ½ÇÇà½ÃŰ´Â µ¥¿¡´Â ´ÙÀ½°ú °°Àº ÀÌÀ¯°¡ ÀÖ´Ù.
2 ÇÁ·Î¼¼½ºÀÇ »óÅÂ
¾Õ¼ »ìÆìºÃµíÀÌ, ÇÁ·Î¼¼½º´Â ÇÁ·Î±×·¥ÀÇ ½ÇÇàÀ̹ÌÁö·Î µ¿½Ã¿¡ ¼ö¸¹Àº µ¿ÀÏÇÑ È¤Àº ´Ù¸¥ ÇÁ·Î±×·¥µéÀÌ ½ÇÇàµÉ ¼ö ÀÖ´Ù. µ¿½Ã¶õ ¸»¿¡ ÁÖ¸ñÇÒ Çʿ䰡 Àִµ¥, ¿©±â¿¡¼ ¸»ÇÏ´Â µ¿½Ã´Â °°Àº ½Ã°£¿¡ ½ÇÇàµÇ´Â °ÍÀ» ÀǹÌÇÏÁö ¾Ê´Â´Ù. ¸®´ª½º ¿î¿µÃ¼Á¦¿¡¼ µ¿½Ã¶ó´Â °ÍÀº ¿©·¯°³ÀÇ ÇÁ·Î¼¼½º¸¦ ªÀº ½Ã°£µ¿¾È switchingÇÏ¸é¼ ½ÇÇàÇÏ´Â °ÍÀ» ÀǹÌÇÑ´Ù. A, B, C 4°³ÀÇ ÇÁ·Î±×·¥ÀÌ ÀÖ´Ù¸é, AÇÁ·Î±×·¥ÀÌ ³¡³¯¶§±îÁö ±â´Ù·È´Ù°¡ B¸¦ ½ÇÇàÇÏ´Â °ÍÀÌ ¾Æ´Ñ, A½ÇÇàÀ» Àá±ñ ÁߴܽÃ۰í, B·Î ½ºÀ§ÄªÇؼ ½ÇÇàÀ» ÇÏ°í ´Ù½Ã ÁߴܽÃ۰í, C¸¦ ½ÇÇà ÇÏ´Â ¹æ½ÄÀÌ´Ù. C¸¦ ½ÇÇàÇÑ ÈÄ¿¡´Â ´Ù½Ã ªÀº ½Ã°£¿¡ A·Î ³Ñ¾î°¡¼ ÀÌÀüÀÇ Áß´ÜµÈ ½ÃÁ¡¿¡¼ ´Ù½Ã ÇÁ·Î¼¼½º¸¦ ¼öÇàÇÑ´Ù.
ÀÌ·¯ÇÑ switching ½Ã°£Àº ¸Å¿ì ª±â ¶§¹®¿¡, ½ÇÁ¦·Î´Â µ¿½Ã¿¡ ½ÇÇàµÇÁö ¾ÊÁö¸¸ µ¿½Ã¿¡ ½ÇÇàµÇ´Â °Íó·³´À²¸Áø´Ù. À̰ÍÀ» time sharing ȤÀº ½ÃºÐÇÒ ¹æ½ÄÀ̶ó°í ÇÑ´Ù. ÀÌ ±â¼úÀº Unix¿¡ ±âº»ÀûÀÎ ±â´ÉÀε¥, ¾ÖÃÊ¿¡ Unix°¡ ½ÃºÐÇÒ ½Ã½ºÅÛ - time sharing system- °³¹ß ÇÁ·ÎÁ§Æ®¿¡¼ À×ÅÂµÈ ¿î¿µÃ¼Á¦À̱⠶§¹®ÀÌ´Ù.
ÀÌ·¸°Ô (¿Ïº®ÇÑ µ¿½Ã´Â ¾Æ´ÏÁö¸¸)µ¿½Ã¿¡ ÇÁ·Î¼¼½º¸¦ ½ÇÇàÇÏ´Â °ÍÀ» ¸ÖƼŽºÅ· ¿î¿µÃ¼Á¦¶ó°í Çϸç, ½Ã°£À» Âɰ³´Â ¹æ½ÄÀ¸·Î ¸ÖƼŽºÅ·À» ±¸ÇöÇÏ´Â °ÍÀ» ½ÃºÐÇÒ ¹æ½Ä ¸ÖƼŽºÅ·À̶ó°í ÇÑ´Ù. ¸®´ª½º ¿î¿µÃ¼Á¦´Â ½ÃºÐÇÒ ¹æ½Ä ¸ÖƼŽºÅ·È¯°æÀ» Áö¿øÇÑ´Ù. ¾Æ·¡ ±×¸²Àº ½ÃºÐÇÒ ¹æ½Ä¿¡¼ÀÇ ÇÁ·Î¼¼½º°¡ ½ÇÇàµÇ´Â ¹æ½ÄÀ» º¸¿©ÁÖ°í ÀÖ´Ù. ![]()
ÇÁ·Î¼¼½º°¡ Çѹø¿¡ ½ÇÇàµÇÁö ¾Ê°í, ½Ã°£À» ±âÁØÀ¸·Î switching µÊÀ¸·Î½á, ÇÁ·Î¼¼½ºÀÇ ÇöÀç »óŰ¡ Áß¿äÇØÁø´Ù. ÇÁ·Î¼¼½º°¡ Áß´ÜµÈ »óȲÀÎÁö, ½ÇÇàµÇ°í ÀÖ´ÂÁöµîÀÇ Á¤º¸¸¦ ¾Ë°í ÀÖ¾î¾ß¸¸ ¿Ã¹Ù¸¥ ½Ã°£¿¡ switchingÀÌ °¡´ÉÇϱ⠶§¹®ÀÌ´Ù.
ÇÁ·Î¼¼½º´Â ´ÙÀ½°ú °°Àº 4°¡ÁöÀÇ »óÅÂÁß Çϳª¸¦ °¡Áö°Ô µÈ´Ù.
3 ÇÁ·Î¼¼½ºÀÇ ¸ðµå
ÇÁ·Î¼¼½º´Â À¯Àú¸ðµå¿Í Ä¿³Î¸ðµåÀÇ µÎ°¡Áö ¸ðµå¸¦ ¿À°¡¸é¼, ½ÇÇàÀÌ µÈ´Ù.
![]()
±»ÀÌ ±ÍÂú°Ô Ä¿³Î¸ðµå¶ó´Â °É µÎ´Â ÀÌÀ¯´Â ÀÚ¿ø¿¡ ´ëÇÑ º¸¾ÈÀÇ ¸ñÀûÀÌ °¡Àå Å©´Ù. ¸®´ª½º´Â ´ÙÁß»ç¿ëÀÚ ¿î¿µÃ¼Á¦ÀÌ´Ù. ¸¸¾à ¸Þ¸ð¸®, »ç¿îµåÄ«µå, Çϵåµð½ºÅ©¿Í °°Àº ÀÚ¿ø¿¡ ¾Æ¹«·± Á¦ÇѾøÀÌ Á¢±ÙÀÌ °¡´ÉÇØÁø´Ù¸é, ½É°¢ÇÑ º¸¾È¹®Á¦°¡ ¹ß»ýÇÒ ¼ö ÀÖÀ» °ÍÀÌ´Ù. ¸®´ª½º´Â Ä¿³Î¸ðµå¶ó´Â °ÍÀ» µÎ¾î¼ À̹®Á¦¸¦ ÇØ°áÇϴµ¥, ¸¸¾à ÇÁ·Î¼¼½º°¡ ½Ã½ºÅÛÀÚ¿øÀ» »ç¿ëÇÏ±æ ¿øÇÑ´Ù¸é, Ä¿³Î¿¡¼ Á¦°øÇÏ´Â API¸¦ ÀÌ¿ëÇØ¼, Ä¿³Î¿¡ ÀÚ¿øÀ» »ç¿ëÇϰÚÀ½À» ¿äÃ»ÇØ¾ß¸¸ ÇÑ´Ù. ÀÌ·¸°Ô µÇ¸é, ¿î¿µÃ¼Á¦ Â÷¿ø¿¡¼ ÀÚ¿ø¿¡ ´ëÇÑ Á¢±ÙÀ» Á¦¾îÇÒ ¼ö ÀÖ°Ô µÉ °ÍÀÌ´Ù.
ÀÌ·¸°Ô Ä¿³Î¿¡¼ Ä¿³Î·Î ¿äûÀ» Çϱâ À§Çؼ Á¦°øÇÏ´Â ÇÔ¼ö¸¦ ½Ã½ºÅÛÄÝÀ̶ó°í ºÎ¸¥´Ù. ¿ì¸®´Â ÀÌ¹Ì ¸î°³ÀÇ ½Ã½ºÅÛÄÝÀ» »ç¿ëÇØ ºÃ´Âµ¥, read(2), write(2), open(2)µîÀÌ ´ëÇ¥ÀûÀÎ ½Ã½ºÅÛÄÝÀÌ´Ù. ¿¹ÄÁµ¥, ÇÁ·Î¼¼½º´Â malloc(2)ÇÔ¼ö¸¦ È£ÃâÇØ¼ Ä¿³Î¿¡ ¸Þ¸ð¸®ÀÇ »ç¿ëÀ» ¿äûÇÒ ¼ö ÀÖ´Ù. ¿äûÀ» ¹ÞÀº Ä¿³ÎÀº »ç¿ë °¡´ÉÇÑ ¿¬¼ÓÀûÀÎ ¸Þ¸ð¸® °ø°£¸¦ ¸¸µç ´ÙÀ½, ÀÌ ¸Þ¸ð¸® °ø°£ÀÇ ÁÖ¼Ò °ªÀ» °¡Áö´Â Æ÷ÀÎÅ͸¦ ¹ÝȯÇÑ´Ù. 4 ÇÁ·Î¼¼½ºÀÇ ½ÇÇà
¸®´ª½º¿¡¼ »õ·Î¿î ÇÁ·Î¼¼½º¸¦ ½ÇÇà½ÃŰ´Â À¯ÀÏÇÑ ¹æ¹ýÀº execl(2)À» ÀÌ¿ëÇÏ´Â °ÍÀÌ´Ù. ÀÌ ÇÔ¼ö´Â ´ÙÀ½°ú °°ÀÌ »ç¿ëÇÒ ¼ö ÀÖ´Ù. #include <unistd.h> int execl(const char *path, const char *arg, ...);
#include <unistd.h> int main(int argc, char **argv) { execl("/bin/ls", "ls", "-al", NULL); }
execl ÇÔ¼ö´Â ÇÁ·Î±×·¥À» ½ÇÇà½ÃÄѼ »õ·Î¿î ÇÁ·Î¼¼½º¸¦ ½ÇÇàÇϸé, ÇöÀçÀÇ ÇÁ·Î¼¼½º À̹ÌÁö¸¦ µ¤¾î½á ¹ö¸°´Ù. ¿¹¸¦µé¾î À§ÀÇ ÇÁ·Î±×·¥À̸§ÀÌ execTestÀ̶ó°í °¡Á¤Çغ¸ÀÚ. execTest ÇÁ·Î±×·¥À» ½ÇÇà½Ã۸é, execTestÀÇ ½ÇÇàÀ̹ÌÁöÀÎ execTest ÇÁ·Î¼¼½º°¡ »ý¼ºµÉ °ÍÀÌ´Ù. ¿©±â¿¡ execlÀ» ÀÌ¿ëÇØ¼ /bin/ls ¸¦ ½ÇÇà½Ã۸é, /bin/lsÀÇ ½ÇÇàÀ̹ÌÁö·Î ¿ÏÀüÈ÷ ´ëüµÇ¾î ¹ö¸°´Ù. ¾Æ·¡ÀÇ ÇÁ·Î±×·¥À» ½ÇÇà½ÃÄÑ º¸ÀÚ. 001 #include <unistd.h> 002 #include <stdio.h> 003 004 int main(int argc, char **argv) 005 { 006 printf("Start\n"); 007 execl("/bin/ls", "ls", "-al", NULL); 008 printf("End\n"); // ½ÇÇàµÇÁö ¾Ê´Â´Ù. 009 } 010´ÙÀ½Àº ½ÇÇà°á°ú´Ù. $ ./execTest Start drwxr-xr-x 2 yundream yundream 4096 2008-02-29 00:08 . drwxr-xr-x 60 yundream yundream 4096 2008-02-29 00:08 .. -rwxr-xr-x 1 yundream yundream 6585 2008-02-29 00:08 execTest -rw-r----- 2 yundream yundream 81 2007-12-17 23:59 hello.txt -rw-r--r-- 1 yundream yundream 12 2007-11-26 23:58 test.txt -rw-r--r-- 1 yundream yundream 489 2007-11-26 23:53 write.c $¿ì¼± 6¹øÂ° ÄÚµåÀÎ printf°¡ ½ÇÇàµÈ°Ç ºÐ¸íÈ÷ È®ÀÎÇÒ ¼ö ÀÖÀ» °ÍÀÌ´Ù. ±×´ÙÀ½ 7¹øÂ° ÁÙÀÎ execlÀÌ È£ÃâµÇ¾î¼ /bin/ls -al ÀÌ ½ÇÇàµÇ¾ú´Ù. ±×·±µ¥, 8¹øÂ° ÁÙÀº ½ÇÇàµÇÁö ¾Ê¾Ò´Ù ? ¾Õ¿¡¼ ¸»Çß´Ù ½ÃÇÇ, execlÀÌ È£ÃâµÇ¸é¼ ÇÁ·Î¼¼½ºÀÇ À̹ÌÁö ÀÚü°¡ /bin/ls ·Î µ¤¾î½áÁ® ¹ö·È±â ¶§¹®¿¡, 8¹øÂ° Äڵ尡 ¾Æ¿¹ ½ÇÇàÀÌ µÇÁö ¾Ê±â ¶§¹®ÀÌ´Ù.
execlÀ» È£ÃâÇϸé ÇÁ·Î¼¼½ºÀÇ À̹ÌÁö¸¦ ¿ÏÀüÈ÷ µ¤¾î¾²°Ô µÈ´Ù´Â Á¡À» ÀÌÇØÇÏ´Â°Ç ±×¸® ¾î·ÆÁö ¾ÊÀ» °ÍÀÌ´Ù. ±×·¸´Ù¸é, »õ·Î¿î ÇÁ·Î¼¼½º¸¦ È£ÃâÇÏ°í ³ª¼, ¿ø·¡ÀÇ ÇÁ·Î±×·¥À¸·Î µÇµ¹¾Æ ¿À·Á¸é ¾î¶±ÇØ¾ß Çϳª ¶ó´Â °í¹ÎÀÌ »ý°Ü³¯ °ÍÀÌ´Ù. »õ·Î¿î ÇÁ·Î¼¼½º¸¦ ½ÇÇà½ÃŰ°í ³ª¼, ÇÁ·Î¼¼½º°¡ Á¾·áµÇ¸é ¿ø·¡ »óÅ·ΠµÇµ¹¾Æ¿À´Â °¡Àå ´ëÇ¥ÀûÀÎ ÇÁ·Î±×·¥Àº shellÀÏ °ÍÀÌ´Ù. ½©ÀÇ ÇÁ·ÒÇÁÆ®¿¡¼ ls ¸¦ ÀÔ·ÂÇϸé, ls ½ÇÇàµÈ ÈÄ ´Ù½Ã ½©»óÅ·ΠµÇµ¹¾Æ ¿Í¼ ÇÁ·ÒÇÁÆ®°¡ ¶³¾îÁö´Â °ÍÀ» È®ÀÎÇÒ ¼ö ÀÖ´Ù. execl ÇÔ¼ö´Â ÇÁ·Î¼¼½º¸¦ µ¤¾î½á ¹ö¸®±â ¶§¹®¿¡, ½©°ú °°Àº ÇÁ·Î±×·¥ÀÇ Á¦ÀÛÀÌ ºÒ°¡´ÉÇÏ´Ù. ¾î¶»°Ô ½© °°Àº ÇÁ·Î±×·¥À» ¸¸µé ¼ö ÀÖÀ»±î ?
ÀÌ ¹®Á¦´Â fork(2)¸¦ ÀÌ¿ëÇÑ ´ÙÁß ÇÁ·Î¼¼½º »ý¼º±â¹ýÀ¸·Î ÇØ°áÇÒ ¼ö Àִµ¥, ÀÌ¿¡ ´ëÇÑ ³»¿ëÀº Á¶±Ý µÚ¿¡ ¾Ë¾Æº¸µµ·Ï ÇÒ °ÍÀÌ´Ù. 5 ¸ÖƼ.´ÙÁß - ÇÁ·Î¼¼½º
À¯´Ð½º ¿î¿µÃ¼Á¦´Â ´ÙÁß ÇÁ·Î¼¼½º¸¦ Áö¿øÇÑ´Ù°í ¾Ë°í ÀÖ´Ù. ±×·±µ¥ ¾Õ¿¡¼ ÇÁ·Î¼¼½º¸¦ »ý¼ºÇÏ´Â À¯ÀÏÇÑ ¹æ¹ýÀº execl ÇÔ¼ö¸¦ ÀÌ¿ëÇÏ´Â °ÍÀ̶ó°í ¹è¿ü´Ù. ¹®Á¦´Â execl ÇÔ¼ö´Â ¿øº» ÇÁ·Î¼¼½ºÀÇ À̹ÌÁö¸¦ µ¤¾î½á ¹ö¸°´Ù´Â °ÍÀ¸·Î, ÀÌ·¸°Ô µÇ¸é ¿î¿µÃ¼Á¦´Â µ¿½Ã¿¡ ´ÜÁö ÇϳªÀÇ ÇÁ·Î¼¼½º¸¸À» °¡Áú ¼ö ÀÖ°Ô µÉ °ÍÀÌ´Ù.
À¯´Ð½º ¿î¿µÃ¼Á¦´Â fork¶ó´Â ÇÁ·Î¼¼½º º¹»ç ÇÔ¼ö¸¦ ÀÌ¿ëÇØ¼ ÀÌ ¹®Á¦¸¦ ÇØ°áÇÒ ¼ö ÀÖ´Ù. fork´Â ¿øº»ÇÁ·Î±×·¥ÀÇ º¹»çÆÇÀ» ¸¸µå´Â ÇÔ¼ö´Ù. fork¿Í execl ÇÔ¼ö´Â ºÐ¸íÈ÷ ´Ù¸£´Ù´Â Á¡À» ÀÎÁöÇϵµ·Ï ÇÏÀÚ. execlÀº ´Ù¸¥ ÇÁ·Î¼¼½º¸¦ »ý¼ºÇÏÁö¸¸ fork´Â ÀÚ±âÀÚ½ÅÀ» º¹Á¦ÇÑ´Ù. Áï À¯´Ð½º ¿î¿µÃ¼Á¦¿¡¼ »õ·Î¿î ÇÁ·Î¼¼½º¸¦ »ý¼º½ÃŰ´Â À¯ÀÏÇÑ ¹æ¹ýÀº ¿©ÀüÈ÷ execl ÇÔ¼ö¸¦ »ç¿ëÇÏ´Â °ÍÀÌ´Ù. +---------+ +--------------+
| Process |----+---| Copy Process |
+---------+ | +--------------+
| +--------------+
+---| Copy Process |
| +--------------+
|
+--- ...
ÇÁ·Î¼¼½º¸¦ º¹»çÇÏ´Â°Ô Æ÷Å©¿Í ºñ½ÁÇÏ´Ù°í ÇØ¼ fork¶ó´Â À̸§À» ºÙÀÌ°Ô µÇ¾ú´Ù.
À̶§ ¿øº» ÇÁ·Î¼¼½º¸¦ ºÎ¸ð ÇÁ·Î¼¼½º¶ó°í Çϰí, ºÎ¸ð ÇÁ·Î¼¼½º·Î ºÎÅÍ º¹»ç µÇ¾î¼ »õ·Î »ý¼ºµÈ ÇÁ·Î¼¼½º¸¦ ÀÚ½Ä ÇÁ·Î¼¼½º¶ó°í ÇÑ´Ù. À̵é ÇÁ·Î¼¼½ºÀÇ °ü°è¿¡ ´ëÇØ¼´Â µÚ¿¡ µû·Î »ìÆìº¸µµ·Ï ÇϰڴÙ.
ÀÌÁ¦ forkÇÔ¼ö¸¦ ÀÌ¿ëÇÔÀ¸·Î½á, execlÀÌ °¡Áö´Â ¿øº» ÇÁ·Î¼¼½º À̹ÌÁö¸¦ µ¤¾î¾²´Â¹®Á¦¸¦ ÇØ°áÇÒ ¼ö ÀÖ´Ù. fork¸¦ ÇØ¼ ¿øº»ÇÁ·Î¼¼½ºÀÇ º¹»çº»À» ¸¸µé°í, ¿©±â¿¡¼ execlÀ» ÀÌ¿ëÇØ¼ »õ·Î¿î ÇÁ·Î¼¼½º¸¦ ½ÇÇà½ÃŰ´Â °ÍÀÌ´Ù. ÀÌ·¯ÇÑ ½ÄÀ¸·Î ÇÁ·Î±×·¥À» »ý¼º½ÃŰ´Â °¡Àå ´ëÇ¥ÀûÀÎ ÇÁ·Î±×·¥ÀÌ ¹Ù·Î shell ÇÁ·Î±×·¥ÀÌ´Ù. shell ¿¡¼ ls ÇÁ·Î±×·¥À» ½ÇÇà½Ã۸é, ´Ù½Ã shell·Î µÇµ¹¾Æ¿À´Â °ÍÀ» È®ÀÎÇÒ ¼ö ÀÖÀ» °ÍÀÌ´Ù. ÀÌ´Â shell ÀÌ ls ¸í·ÉÀ» ¹ÞÀ¸¸é forkÇÔ¼ö¸¦ ÀÌ¿ëÇØ¼ ÀÚ½Ä ÇÁ·Î¼¼½º¸¦ ¸¸µé°í, ÀÌ ÀÚ½Ä ÇÁ·Î¼¼½º¿¡¼ execlÀ» ÀÌ¿ëÇØ¼ ls¸¦ ½ÇÇà½Ã۱⠶§¹®¿¡ °¡´ÉÇØÁø´Ù.
ÀÌ·¸°Ô fork & execl À» ÀÌ¿ëÇϸé, ÁøÁ¤ÇÑ ¸ÖƼ ÇÁ·Î¼¼½º ȯ°æÀÌ °¡´ÉÇØ Áö°Ô µÈ´Ù. À¯´Ð½º ¿î¿µÃ¼Á¦´Â fork & execl À» ÅëÇØ¼ »ý¼ºµÈ ¼ö¸¹Àº ÇÁ·Î¼¼½º¸¦ ½ÃºÐÇÒ¹æ½ÄÀ¸·Î µ¿½Ã¿¡ ¼öÇàÇÔÀ¸·Î½á, ¸ÖƼ ÇÁ·Î¼¼½º ȯ°æÀ» Á¦°øÇÑ´Ù. 5.1 fork¸¦ ÀÌ¿ëÇÑ ÀÚ½ÄÇÁ·Î¼¼½º »ý¼º
fork ´Â ÀÚ±âÀÚ½ÅÀ» º¹»çÇØ¼ ÇÁ·Î¼¼½º¸¦ »ý¼ºÇÏ´Â ¿î¿µÃ¼Á¦¿¡¼ Á¦°øÇÏ´Â ÇÔ¼ö·Î, ±× ºÐ±âµÇ´Â ¸ð½ÀÀÌ Æ÷Å©¿Í ºñ½ÁÇÏ´Ù°í ÇØ¼ fork¶ó°í À̸§Áö¿öÁ³´Ù. ![]()
fork ÇÔ¼ö´Â ´ÙÀ½°ú °°ÀÌ ¼±¾ðµÇ¾î ÀÖ´Ù. #include <unistd.h> pid_t fork(void);Äڵ峻¿¡¼ fork(2)ÇÔ¼ö¸¦ È£ÃâÇϸé, ÀÚ½ÄÇÁ·Î¼¼½º°¡ »ý¼ºÀÌ µÈ´Ù. ÀÌ °úÁ¤Àº ÀÚ½ÄÀÌ ºÎ¸ðÀÇ À¯ÀüÇÐÀû Á¤º¸¸¦ »ó¼Ó¹Þ´Â °Í°ú ºñ½ÁÇѵ¥, ½ÇÁ¦ ÀÚ½ÄÇÁ·Î¼¼½º´Â ºÎ¸ð·Î ºÎÅÍ ¸¹Àº Á¤º¸µéÀ» ±×´ë·Î »ó¼Ó¹Þ´Â´Ù. ¿¹¸¦µéÀÚ¸é, ºÎ¸ðÇÁ·Î¼¼½ºÀÇ Á¤º¸µé, ¿·ÁÀÖ´Â ÆÄÀÏ, signalÁ¤º¸, ¸Þ¸ð¸®¿¡ ÀÖ´Â ¸¹Àº Á¤º¸µéÀÌ´Ù. forkÇÔ¼ö°¡ ¼º°øÀûÀ¸·Î ¼öÇàµÇ¾î¼ ÀÚ½Ä ÇÁ·Î¼¼½º°¡ »ý¼ºµÇ¸é, ºÎ¸ðÇÁ·Î¼¼½º¿¡°Ô´Â »õ·Î »ý¼ºµÈ ÀÚ½ÄÇÁ·Î¼¼½ºÀÇ PID°¡ ¸®ÅÏÀÌ µÇ°í, ÀÚ½ÄÇÁ·Î¼¼½º¿¡°Ô´Â 0ÀÌ ¸®ÅϵȴÙ.
´ÙÀ½Àº fork¸¦ ÀÌ¿ëÇØ¼ ÀÚ½ÄÇÁ·Î¼¼½º¸¦ »ý¼º½ÃŲ ÇÁ·Î±×·¥ÀÌ´Ù. ÇÁ·Î±×·¥ÀÇ À̸§Àº forktest.c ·Î ÇÏÀÚ. #include <unistd.h> #include <stdlib.h> #include <string.h> #include <stdio.h> int main() { int pid; int i; i = 1000; pid = fork(); if (pid == -1) { perror("fork error "); exit(0); } // ÀÚ½ÄÇÁ·Î¼¼½º°¡ ½ÇÇà½ÃŰ´Â ÄÚµå else if (pid == 0) { printf("ÀÚ½Ä : ³» PID´Â %d\n", getpid()); while(1) { printf("-->%d\n", i); i++; sleep(1); } } // ºÎ¸ðÇÁ·Î¼¼½º°¡ ½ÇÇà½ÃŰ´Â ÄÚµå else { printf("ºÎ¸ð : ³»°¡ ³ºÀº ÀÚ½ÄÀÇ PID´Â %d\n", pid); while(1) { printf("==>%d\n", i); i += 4; sleep(1); } } }ÄÄÆÄÀÏ ÇÑ ÈÄ ½ÇÇà½ÃÄÑ º¸±â ¹Ù¶õ´Ù. ºÎ¸ðÇÁ·Î¼¼½º¿Í ÀÚ½ÄÇÁ·Î¼¼½º°¡ µ¿½Ã¿¡ ÁÖ¾îÁø Äڵ带 ½ÇÇà½ÃŰ´Â °ÍÀ» È®ÀÎÇÒ ¼ö ÀÖÀ» °ÍÀÌ´Ù. ps ¸¦ ÀÌ¿ëÇϸé À̵é ÇÁ·Î¼¼½º¿ÍÀÇ °ü°è¸¦ ¸íÈ®ÇÏ°Ô È®ÀÎÇÒ ¼ö ÀÖ´Ù. $ ps -ef | grep forktest UID PID PPID C STIME TTY TIME CMD yundream 12119 8557 0 17:33 pts/0 00:00:00 ./forktest yundream 12120 12119 0 17:33 pts/0 00:00:00 ./forktest¿ì¸®´Â PID 12120À» °¡Áö´Â ÀÚ½ÄÇÁ·Î¼¼½º°¡ »ý¼ºµÇ¾úÀ½À» È®ÀÎÇÒ ¼ö ÀÖ´Ù. PID 12120ÀÎ ÇÁ·Î¼¼½º°¡ ÀÚ½ÄÇÁ·Î¼¼½ºÀÎ °ÍÀº PPID°ªÀ» ÀÌ¿ëÇØ¼ È®Àΰ¡´É ÇÏ´Ù. PPID ´Â parent Process IDÀÇ ÁÙÀÓ¸»ÀÌ´Ù. PID, PPID µî¿¡ ´ëÇÑ °ÍÀº ÀÌ ¹®¼ÀÇ ÈĹݺο¡ ÀÚ¼¼È÷´Ù·çµµ·Ï ÇÒ °ÍÀÌ´Ù. 5.2 fork¿Í exec¸¦ ÀÌ¿ëÇÑ »õ·Î¿î ÇÁ·Î¼¼½ºÀÇ »ý¼º
±×·³ ¿¹Á¦ Äڵ带 ÀÌ¿ëÇØ¼ fork & execlÀÇ ÀÛµ¿¹æ½Ä¿¡ ´ëÇØ¼ ¾Ë¾Æº¸µµ·Ï ÇϰڴÙ. ¿©±â¿¡¼ ¸¸µé°íÀÚ ÇÏ´Â ÇÁ·Î±×·¥Àº °£´ÜÇÑ shell ÇÁ·Î±×·¥ÀÌ´Ù. 001 #include <stdlib.h> 002 #include <string.h> 003 #include <unistd.h> 004 #include <stdio.h> 005 #include <sys/wait.h> 006 #include <sys/types.h> 007 008 #define chop(str) str[strlen(str)-1] = 0x00; 009 010 int main(int argc, char **argv) 011 { 012 char buf[256]; 013 printf("My Shell\n"); 014 int pid; 015 while(1) 016 { 017 // »ç¿ëÀÚ ÀÔ·ÂÀ» ±â´Ù¸°´Ù. 018 printf("# "); 019 fgets(buf, 255, stdin); 020 chop(buf); 021 022 // ÀÔ·ÂÀÌ quit ¶ó¸é, ÇÁ·Î±×·¥À» Á¾·áÇÑ´Ù. 023 if (strncmp(buf, "quit", 4) == 0) 024 { 025 exit(0); 026 } 027 028 // ÀÔ·ÂÇÑ ¸í·ÉÀÌ ½ÇÇà°¡´ÉÇÑ ÇÁ·Î±×·¥À̶ó¸é 029 // fork ÇÑÈÄ execlÀ» ÀÌ¿ëÇØ¼ ½ÇÇàÇÑ´Ù. 030 if (access(buf, X_OK) == 0) 031 { 032 pid = fork(); 033 if (pid < 0) 034 { 035 fprintf(stderr, "Fork Error"); 036 } 037 if (pid == 0) 038 { 039 if(execl(buf, buf, NULL) == -1) 040 fprintf(stderr, "Command Exec Error\n\n"); 041 exit(0); 042 } 043 if (pid > 0) 044 { 045 // ºÎ¸ð ÇÁ·Î¼¼½º´Â ÀÚ½ÄÇÁ·Î¼¼½º°¡ Á¾·áµÇ±æ ±â´Ù¸°´Ù. 046 int status; 047 waitpid(pid, &status, WUNTRACED); 048 } 049 } 050 else // ¸¸¾à ½ÇÇà°¡´ÉÇÑ ÇÁ·Î±×·¥ÀÌ ¾Æ´Ï¶ó¸é, ¿¡·¯¸Þ½ÃÁö¸¦ Ãâ·Â 051 { 052 fprintf(stderr, "Command Not Found\n\n"); 053 } 054 } 055 } 056ÀÌ ÇÁ·Î±×·¥Àº ¾ÆÁÖ °£´ÜÇÑ shellÀ¸·Î, ÇÁ·Î±×·¥ÀÇ ÀÎÀÚ¸¦ ó¸®ÇÏÁöµµ ¸øÇÏÁö¸¸, fork ¿Í execlÀ» ¼³¸íÇϴµ¥¿¡´Â ºÎÁ·ÇÔÀÌ ¾øÀ» °ÍÀÌ´Ù. ´ÙÀ½Àº ½ÇÇà½ÃŲ ¿¹ÀÌ´Ù. ÇÁ·Î±×·¥À̸§Àº myshell ·Î Çß´Ù. MY Shell $ myshell # /usr/bin/w 01:15:32 up 2:58, 4 users, load average: 0.47, 0.50, 0.62 USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT yundream :0 - 00:05 ?xdm? 14:20m 0.05s /bin/bash /usr/ yundream pts/1 :0 00:06 9.00s 1.47s 1.24s w3m -F http://w yundream pts/3 :0 00:54 0.00s 0.22s 0.00s ./myshell yundream pts/4 :0.0 00:53 22:13m 0.40s 0.27s BitchX irc.nuri # ll Command Not Found # quit $ 6 ÇÁ·Î¼¼½º °ü°è6.1 ºÎ¸ðÇÁ·Î¼¼½º¿Í ÀÚ½ÄÇÁ·Î¼¼½º init ÇÁ·Î¼¼½º
À§¿¡¼ fork¿Í exec ÇÔ¼ö¸¦ ÀÌ¿ëÇØ¼ ÇÁ·Î¼¼½º¸¦ ½ÇÇà½ÃŰ´Â ¹æ¹ý¿¡ ´ëÇØ¼ ¾Ë¾Æº¸¾Ò´Ù. ¿©±â¿¡¼ ¿ì¸®´Â ÇÁ·Î¼¼½º°¡ ÀüÇô µ¶¸³ÀûÀ¸·Î »ý¼ºµÇ´Â°Ô ¾Æ´Ñ, ºÎ¸ð ÇÁ·Î¼¼½º¿¡¼ »ý±ä´Ù´Â °Íµµ ´ýÀ¸·Î ¹è¿ì°Ô µÇ¾ú´Ù. ºÎ¸ðÇÁ·Î¼¼½º°¡ ÀÖ´Ù¸é, ÀڽϹÀÌ µÇ´Â ÇÁ·Î¼¼½º°¡ ÀÖÀ» °ÍÀÌ´Ù. ºÎ¸ðÇÁ·Î¼¼½º·Î ºÎÅÍ forkµÇ¾î»õ »ý¼ºµÈ ÇÁ·Î¼¼½º¸¦ ÀÚ½Ä ÇÁ·Î¼¼½º¶ó°í ºÎ¸¥´Ù.
ºÎ¸ðÇÁ·Î¼¼½º¿Í ÀÚ½ÄÇÁ·Î¼¼½ºÀÇ °ü°è´Â ½±°Ô ÀÌÇØµÇ¾úÀ» °ÍÀÌ´Ù. ±×·¸´Ù¸é, ºÎ¸ðÀÇ ºÎ¸ðÀÇ ºÎ¸ðÀÇ ºÎ¸ðÀÇ ÇÁ·Î¼¼½º°¡ ÀÖÀ» °ÍÀ̰í, ÃÖÃÊÀÇ ¾Æ´ã°ÝÀÎ ÇÁ·Î¼¼½º°¡ ÀÖÀ¸¸®¶ó´Â°É Ã߸®ÇÒ ¼ö ÀÖÀ» °ÍÀÌ´Ù.
¹Ù·Î init°¡ ¸ðµç ÇÁ·Î¼¼½ºÀÇ Á¶»óÀÌ µÇ´Â ÇÁ·Î¼¼½º´Ù. ¸ðµç ÇÁ·Î¼¼½º´Â init·Î ºÎÅÍ fork & exec µÇ¾î¼ »ý¼ºÀÌ µÈ´Ù. pstree¸í·ÉÀ» ÀÌ¿ëÇϸé, ÇÁ·Î¼¼½ºÀÇ °ü°è¸¦ È®ÀÎÇÒ ¼ö ÀÖ´Ù. $ pstree
init¦¡¦¨¦¡NetworkManager¦¡¦¡¦¡{NetworkManager}
¦§¦¡NetworkManagerD
¦§¦¡acpid
¦§¦¡amarok¦¡¦¡¦¡11*[{amarok}]
¦§¦¡atd
¦§¦¡avahi-daemon¦¡¦¡¦¡avahi-daemon
¦§¦¡bonobo-activati¦¡¦¡¦¡{bonobo-activati}
¦§¦¡console-kit-dae¦¡¦¡¦¡61*[{console-kit-dae}]
¦§¦¡cron
¦§¦¡cupsd
¦§¦¡2*[dbus-daemon]
¦§¦¡dbus-launch
....
6.2 ÇÁ·Î¼¼½ºÀÇ identify¿Í °ü°è¿¡¼ÀÇ À§Ä¡
ÇÁ·Î¼¼½º´Â ¿î¿µÃ¼Á¦À§¿¡¼ ½ÇÇàµÇ´Â ½ÇÇఴüÀÌ´Ù. °´Ã¼°¡ °´Ã¼·Î½á Á¤Ã¼¼ºÀ» °¡Áö±â À§Çؼ´Â ´Ù¸¥°´Ã¼¿Í ÀÚ½ÅÀ» ºÐ¸®ÇÒ ¼ö ÀÖ´Â identify ¸¦ °¡Áö°í ÀÖ¾î¾ß ÇÑ´Ù.
°¢ ÇÁ·Î¼¼½º´Â ´ÙÀ½ÀÇ 2°¡Áö ¿ä¼Ò¸¦ ÀÌ¿ëÇØ¼ ÀÚ½ÅÀÇ identify ¸¦ È®º¸ÇÒ ¼ö ÀÖ´Ù.
Áï ÇÁ·Î¼¼½ºÀÇ identify¿Í ÇÔ²², ÇÁ·Î¼¼½ºÀÇ °ü°è¿¡¼ÀÇ À§Ä¡µµ Á¤ÀÇÇÒ ¼ö ÀÖ¾î¾ß ÇÑ´Ù.
±×·¡¼, °¢ ÇÁ·Î¼¼½º´Â name°ú PID¿Ü¿¡µµ ÇÁ·Î¼¼½º±º¿¡¼ÀÇ ÀÚ½ÅÀÇ À§Ä¡¸¦ Á¤ÀÇÇϱâ À§ÇÑ ´ÙÀ½°ú °°Àº Á¤º¸µéÀ» °¡Áø´Ù.
$ ps -efjc | grep forktest UID PID PPID PGID SID CLS PRI STIME TTY TIME CMD yundream 12198 8557 12198 8557 TS 24 17:40 pts/0 00:00:00 ./forktest yundream 12199 12198 12198 8557 TS 21 17:40 pts/0 00:00:00 ./forktestÇÁ·Î¼¼½ºÀÇ »ó¼¼Á¤º¸µéÀÌ Ãâ·ÂµÊÀ» ¾Ë ¼ö ÀÖ´Ù. PID°¡ 12199ÀÎ ÇÁ·Î¼¼½º°¡ 12198·Î ºÎÅÍ »ý¼ºµÈ ÀÚ½ÄÇÁ·Î¼¼½ºÀÓÀ» È®ÀÎÇÒ ¼ö ÀÖ´Ù. ¶ÇÇÑ 12198 ÇÁ·Î¼¼½º´Â PID 8557 ·Î ºÎÅÍ »ý¼ºµÈ ÀÚ½Ä ÇÁ·Î¼¼½ºÀÓÀ» ¹Ì·ç¾î ÁüÀÛÇÒ ¼ö ÀÖ´Ù. ±×·¸´Ù¸é PID 8557ÀÎ ÇÁ·Î¼¼½º°¡ ¾î¶² ÇÁ·Î¼¼½ºÀÎÁö È®ÀÎÇØ º¸µµ·Ï ÇÏÀÚ. $ ps -efjc | grep 8557 UID PID PPID PGID SID CLS PRI STIME TTY TIME CMD yundream 8557 8550 8557 8557 TS 24 13:37 pts/0 00:00:00 bash±×·¸´Ù. bash ÇÁ·Î±×·¥ÀÓÀ» ¾Ë ¼ö ÀÖ´Ù. bash´Â ¿ì¸®°¡ forktest ÇÁ·Î±×·¥À» ½ÇÇà½ÃŲ ½©ÇÁ·Î±×·¥À¸·Î, bashµµ fork()¸¦ ÀÌ¿ëÇØ¼ forktest ¸¦ ½ÇÇà½ÃÄ×À» °ÍÀÓÀ¸·Î forktestÀÇ ºÎ¸ðÇÁ·Î¼¼½º°¡ µÈ´Ù. À̵éÀÇ °ü°è´Â ´ÙÀ½°ú °°Àº Tree ÇüÅ·ΠǥÇöÇÒ ¼ö ÀÖÀ» °ÍÀÌ´Ù. fork&exec fork bash ---+----------- forktest ---+-------- forktestbashÀÇ ºÎ¸ðÇÁ·Î¼¼½º´Â PID 8550À» °¡Áö´Â ÇÁ·Î¼¼½ºÀÏ °ÍÀ̰í, °Å½½·Î ¿Ã¶ó°¡¸é °á±¹ init ÇÁ·Î¼¼½º¸¦ ¸¸³ª°Ô µÉ °ÍÀÌ´Ù.
±×·¸´Ù¸é ¿Ö ±×·ìÀÌ Áß¿äÇÑ °É±î. ´ÜÁö ºÐ·ùÇϱâ ÁÁ°Ô Çϱâ À§Çؼ ? ¹°·Ð ±×·±ÀÌÀ¯µµ ÀÖ±â´Â ÇÏÁö¸¸, Á» ´õ ±Ùº»ÀûÀÎ ÀÌÀ¯°¡ ÀÖ´Ù.
±×·ìÀº ½Ç»ýȰ¿¡¼ÀÇ °¡Á·µéÀÌ ±×·¸µíÀÌ, °øÅëÀÇ ÀÚ¿øÀ» °øÀ¯ÇÏ´Â °ü°è·Î ¼·Î¿¡°Ô ¿µÇâÀ» ³¢Ä£´Ù. Áï ºÎ¸ðÇÁ·Î¼¼½º°¡ Á¾·áµÇ¸é ÀÚ½Ä ÇÁ·Î¼¼½ºµµ µû¶ó¼ Á¾·áµÇ¾î¹ö¸®°Å³ª ºÎ¸ð·ÎºÎÅÍ ¹ö·ÁÁø °í¾Æ°¡ µÇ´Â µîÀÇ ¿µÇâÀ» ¹Þ´Â´Ù. ¶ÇÇÑ ºÎ¸ðÇÁ·Î¼¼½º´Â ÀÚ½ÄÇÁ·Î¼¼½º¸¦ Á¾·á½Ãų ¼ö ÀÖÀ¸¸ç, ¾Æ¿¹ ºÐ°¡½ÃÄѹö¸± ¼öµµ ÀÖ´Ù.
ºÎ¸ð¿Í ÀÚ½ÄÇÁ·Î¼¼½º°£ÀÇ ¾î¶² ¸Åü¸¦ ÀÌ¿ëÇØ¼ ¼ÒÅë ÀÌ·ç¾îÁø´Ù´Â °Çµ¥, ¸®´ª½º ¿î¿µÃ¼Á¦´Â signalÀ̶ó´Â ¸Åü¸¦ ÀÌ¿ëÇØ¼, ºÎ¸ð¿Í ÀÚ½ÄÇÁ·Î¼¼½º°£¿¡ ¼ÒÅëÀ» ÇÑ´Ù. ¿¹¸¦µéÀÚ¸é ºÎ¸ðÇÁ·Î¼¼½º°¡ ³Ê ±×³É Á×¾î¶ó¶ó°í ½ÅÈ£¸¦ º¸³»°Ç³ª º¸³»Áö ¾Ê´Â ½ÄÀÌ´Ù. ¸¸¾à ºÎ¸ðÇÁ·Î¼¼½º°¡ Á×À¸¸é¼, ÀÚ½ÄÇÁ·Î¼¼½ºµé¿¡°Ô ³ÊÈñµµ µû¶ó¼ Á×¾î¶ó - Á» ÀÜÀÎÇѰ¡? - ¶ó°í Çϸé, ÀÚ½ÄÇÁ·Î¼¼½ºµéµµ ÇÔ²² Á×´Â °Å°í, Àڱ⸸ Á×°Ú´Ù°í ÇÏ°í ½ÅÈ£¸¦ º¸³»Áö ¾Ê´Â´Ù¸é, ÀÚ½ÄÇÁ·Î¼¼½º´Â °í¾ÆÇÁ·Î¼¼½º°¡ µÇ´Â ½ÄÀÌ´Ù.
signalÀÇ »ç¿ë°ú °í¾ÆÇÁ·Î¼¼½º¿¡ ´ëÇÑ °ÍÀº µû·Î ¾ð±ÞµÉ °ÍÀÌ´Ù. 6.3 °í¾Æ ÇÁ·Î¼¼½º
À§¿¡¼ ÇÁ·Î¼¼½º´Â ºÎ¸ðÇÁ·Î¼¼½º¿Í ±×·ìÀ» ¸Î´Â´Ù´Â °ÍÀ» ¹è¿ü´Ù. ±×¸®°í °í¾Æ ÇÁ·Î¼¼½º¿¡ ´ëÇØ¼µµ °£´ÜÇÏ°Ô ¾Ë¾Æº¸¾Ò´Ù. °í¾Æ ÇÁ·Î¼¼½º¶õ Áï, ºÎ¸ðÇÁ·Î¼¼½º°¡ Á×À¸¸é¼ ÀڽŸ¸ Á×¾î¼ ÀÚ½ÄÇÁ·Î¼¼½º´Â ±×´ë·Î ³²¾ÆÀÖ´Â »óÅ´Ù. ºÎ¸ðÇÁ·Î¼¼½º°¡ Á×¾úÀ¸´Ï °í¾Æ°¡ µÉ¼ö ¹Û¿¡...!!!
°í¾Æ ÇÁ·Î¼¼½º´Â ¾î¶»°Ô µÉ±î. ±×³É ¹ö·ÁÁú±î ? ±×·¸´Ù¸é ³Ê¹« ºñÁ¤ÇÑ°Í °°´Ù´Â »ý°¢ÀÌ µç´Ù. À¯´Ð½º ¿î¿µÃ¼Á¦¸¦ ¸¸µé´ø °³¹ßÀÚµéÀÌ ¸Å¿ì Àΰ£ÀûÀÌ¿©¼ ±×·¨´ÂÁö´Â ¸ð¸£°ÚÁö¸¸ À̵éÀº °í¾Æ°¡µÈ ÇÁ·Î¼¼½º¸¦ init ÇÁ·Î¼¼½º°¡ °ü¸®Çؼ ¹ö·ÁÁöÁö ¾Êµµ·Ï ¼³°è¸¦ Çß´Ù. Çö½Ç¿¡¼ °í¾Æ¸¦ ¹ö¸®Áö ¾Ê°í, »çȸ¿¡¼ º¸È£ÇÏ´Â °Íó·³ ¸»ÀÌ´Ù.
ÀÌ·ÐÀûÀ¸·Î °í¾Æ ÇÁ·Î¼¼½º´Â ¾ÆÁÖ °£´ÜÇÏ°Ô ¸¸µé¼ö ÀÖ´Ù. ÀÚ½ÄÇÁ·Î¼¼½º¸¦ »ý¼º½ÃŲ ÈÄ ºÎ¸ðÇÁ·Î¼¼½º¸¦ Á¾·á½Ã۱⸸ ÇÏ¸é µÈ´Ù.
À§ÀÇ forktest.c¿¡¼ ÀÚ½Ä ÇÁ·Î¼¼½º°¡ °í¾Æ ÇÁ·Î¼¼½º°¡ µÇµµ·Ï ¼öÁ¤ÇØ º¸¾Ò´Ù. ÇÁ·Î±×·¥ÀÇ À̸§Àº forktest2.c ·Î ÇϰڴÙ. #include <unistd.h> #include <stdlib.h> #include <string.h> #include <stdio.h> int main() { int pid; int i; i = 1000; pid = fork(); if (pid == -1) { perror("fork error "); exit(0); } // ÀÚ½ÄÇÁ·Î¼¼½º°¡ ½ÇÇà½ÃŰ´Â ÄÚµå else if (pid == 0) { printf("ÀÚ½Ä : ³» PID´Â %d\n", getpid()); while(1) { printf("-->%d\n", i); i++; sleep(1); } } // ºÎ¸ðÇÁ·Î¼¼½º°¡ ½ÇÇà½ÃŰ´Â ÄÚµå else { printf("ºÎ¸ð : ³»°¡ ³ºÀº ÀÚ½ÄÀÇ PID´Â %d\n", pid); sleep(1); printf("T.T ³ªÁ׳×\n"); exit(0); } }ÀÌÁ¦ ½ÇÇà½ÃÄÑ º¸µµ·Ï ÇÏÀÚ. $ ./forktest ºÎ¸ð : ³»°¡ ³ºÀº ÀÚ½ÄÀÇ PID´Â 8207 ÀÚ½Ä : ³» PID´Â 8207 -->1000 T.T ³ªÁ×³× -->1001 yundream@yundream-desktop:~$ -->1002 -->1003 yundream@yundream-desktop:~$ -->1004 -->1005 -->1006 -->1007 -->1008½©°ú´Â µû·Î ÀÚ½ÄÇÁ·Î¼¼½º°¡ °è¼Ó ½ÇÇàµÇ´Â°É ¾Ë ¼ö ÀÖÀ» °ÍÀÌ´Ù. ÀÌÁ¦ Ctrl+C ¸¦ ´·¯º¸ÀÚ. Ctrl+C¸¦ ´©¸£¸é ÀϹÝÀûÀ¸·Î ÇÁ·Î¼¼½º´Â Á¾·á°¡ µÈ´Ù´Â °ÍÀ» °æÇèÀûÀ¸·Î ¾Ë°í ÀÖÀ» °ÍÀÌ´Ù. - Á¤È®È÷ ¸»ÇÏÀÚ¸é SIGINT¶ó´Â ½Ã±×³ÎÀÌ Àü´ÞµÇ°í, ÀÌ¿¡ ´ëÇÑ ¹ÝÀÀÀ¸·Î ÇÁ·Î¼¼½º°¡ Á״´Ù. ½Ã±×³ÎÀº ³ªÁß¿¡ ´Ù·ê °ÍÀÌ´Ù -. ±×·¯³ª Ctrl+C¸¦ ¾Æ¹«¸® ´·¯µµ ÀÚ½ÄÇÁ·Î¼¼½º°¡ Á×Áö ¾Ê´Â°É ¾Ë ¼ö ÀÖÀ» °ÍÀÌ´Ù. ¿Ö³ÄÇϸé, bash ÀÇ ÀÚ½ÄÀÇ ÀÚ½Ä ÇÁ·Î¼¼½º, Áï °°Àº ±×·ì¿¡ ¼ÓÇÏÁö ¾ÊÀº ÀüÇô ´Ù¸¥ ±×·ìÀÇ ÇÁ·Î¼¼½º°¡ µÇ¾ú±â ¶§¹®ÀÌ´Ù. ps °á°ú·Î È®ÀÎÇØ º¸µµ·Ï ÇÏÀÚ. #ps -efjc | grep forktest UID PID PPID PGID SID CLS PRI STIME TTY TIME CMD yundream 8207 1 8206 8093 TS 24 00:16 pts/5 00:00:00 ./forktestPPID°¡ 1 Áï initÀÇ ÀÚ½ÄÇÁ·Î¼¼½º°¡ µÇ¾úÀ½À» È®ÀÎÇÒ ¼ö ÀÖ´Ù. Áýµµ Àýµµ ¾ø´Â °í¾ÆÇÁ·Î¼¼½º¶ó´Â ¾ê±â°¡ µÇ°Ú´Ù. 6.4 Daemon ÇÁ·Î¼¼½º
°í¾ÆÇÁ·Î¼¼½º´Â ¾î°¨ÀÌ ÁÁÁö ¾Ê¾Æ º¸À̱â´Â ÇÏÁö¸¸, ÇÁ·Î¼¼½ºÀÇ ¶Ç´Ù¸¥ °¡´É¼ºÀ» º¸¿©ÁØ´Ù. Áï ÇöÀç À¯Àú¿Í ÇÁ·Î¼¼½ºÀÇ ¿µÇâÀ» ¹ÞÁö ¾Ê°í ¹é±×¶ó¿îµå¿¡¼ ½ÇÇàµÇ´Â ÇÁ·Î¼¼½ºÀÇ Á¦ÀÛ¿¡ °üÇÑ °ÍÀÌ´Ù.
ÀÌ·¸°Ô ÇöÀç ȸé°ú ÇÁ·Î¼¼½º¿¡¼ ¶³¾îÁ® ³ª°¡¼ µ¶¸³ÀûÀ¸·Î ½ÇÇàµÇ´Â ÇÁ·Î¼¼½º¸¦ µ¥¸ó ÇÁ·Î¼¼½º¶ó°í ÇÑ´Ù. °¡Àå ´ëÇ¥ÀûÀÎ ÇÁ·Î±×·¥ÀÌ À¥¼ºñ½º¸¦ À§ÇÑ À¥¼¹ö ÇÁ·Î±×·¥ÀÏ °ÍÀÌ´Ù. ÀÌ·± ÇÁ·Î±×·¥µéÀº °ÅÀÇ ¿î¿µÃ¼Á¦°¡ ½ÃÀ۵ʰú µ¿½Ã¿¡ ½ÃÀÛµÇ¾î¼ ¿î¿µÃ¼Á¦°¡ ³¡³¯¶§±îÁö µÚ¿¡¼ ¿ì¸®°¡ ´«Ä¡Ã¤Áö ¸øÇÏ´Â »óÅ¿¡¼½ÇÇàÀÌ µÈ´Ù.
µ¥¸óÇÁ·Î¼¼½º°¡ µÇ·Á¸é ´ÙÀ½°ú °°Àº Á¶°ÇÀ» °®Ãß¾î¾ß ÇÑ´Ù.
´ÙÀ½Àº ¿ÏÀüÇÑ µ¥¸ó ÇÁ·Î¼¼½º´Ù. ÇÁ·Î±×·¥À̸§Àº daemon.c·Î ÇÏÀÚ.
001 #include <unistd.h> 002 #include <stdlib.h> 003 #include <string.h> 004 #include <stdio.h> 005 006 int main() 007 { 008 int pid; 009 int i; 010 011 i = 1000; 012 pid = fork(); 013 if (pid == -1) 014 { 015 perror("fork error "); 016 exit(0); 017 } 018 // ÀÚ½ÄÇÁ·Î¼¼½º°¡ ½ÇÇà½ÃŰ´Â ÄÚµå 019 else if (pid == 0) 020 { 021 printf("ÀÚ½Ä : ³» PID´Â %d\n", getpid()); 022 close(0); 023 close(1); 024 close(2); 025 setsid(); 026 while(1) 027 { 028 printf("-->%d\n", i); 029 i++; 030 sleep(1); 031 } 032 } 033 // ºÎ¸ðÇÁ·Î¼¼½º°¡ ½ÇÇà½ÃŰ´Â ÄÚµå 034 else 035 { 036 printf("ºÎ¸ð : ³»°¡ ³ºÀº ÀÚ½ÄÀÇ PID´Â %d\n", pid); 037 sleep(1); 038 printf("T.T ³ªÁ׳×\n"); 039 exit(0); 040 } 041 } 042
$ ps -efjc | grep daemon UID PID PPID PGID SID CLS PRI STIME TTY TIME CMD yundream 8252 1 8252 8252 TS 24 00:43 ? 00:00:00 ./daemonPPID°¡ 1 À̰í, »õ·Î¿î Session IDÀÎ 8252¸¦ °¡Á³À¸¸ç (ÀÌ ÇÁ·Î¼¼½º°¡ ¼¼¼ÇÀÇ ÁÖÀÎÀ̹ǷÎ, PID°¡ SID°¡ µÈ´Ù) Å͹̳Î(TTY)°¡ ¾øÀ½À» È®ÀÎÇÒ ¼ö ÀÖ´Ù. 28¹ø ÁÙÀÇ printf °á°úµµ ȸ鿡 Ãâ·ÂµÇÁö ¾Ê´Â °ÍÀ» È®ÀÎÇÒ ¼ö ÀÖ´Ù. ¿ÏÀüÇÑ µ¥¸ó ÇÁ·Î¼¼½º°¡ ¸¸µé¾îÁø °ÍÀÌ´Ù.
µ¥¸ó ÇÁ·Î¼¼½º´Â ƯÈ÷ Internet¼¹ö ÇÁ·Î±×·¥À» ¸¸µå´Âµ¥, Áß¿äÇÏ°Ô »ç¿ëµÇ´Â ±â¹ýÀ¸·Î ³×Æ®¿öÅ© ÇÁ·Î±×·¡¹Ö¿¡¼ Áß¿äÇÏ°Ô ´Ù·ç¾îÁö´Â ±â¼úÀÌ´Ù.
|
|
|
|
EmailÀ» ±âÀÔÇϸé, ´ñ±ÛÀÌ ¸ÞÀÏ·Î Àü´ÞµË´Ï´Ù. |
|