ÁöÀºÀÌ : kukuta@gmail.com Âü°í : Advenced Programming in Unix Environment ---- [[TableOfContents]] == Daemon À̶õ? == DaemonÇÁ·Î¼¼½º´Â ½Ã½ºÅÛ ½ÃÀÛÀÌ ½ÃÀÛÇÒ ¶§ ±× »ý¸íÀ» ½ÃÀÛÇÏ¿©, ¿ì¸®°¡ ¾ËÁö ¸øÇÏ´Â ¹é±×¶ó¿îµå¿¡¼­ ÀÚ½ÅÀÇ ÇÒÀÏÀ» ¹¬¹¬È÷ ÇàÇÏ´Ù, ½Ã½ºÅÛ°ú ÇÔ²² ±× »ý¸íÀ» ´ÙÇÑ´Ù. ÀÌ ÆäÀÌÁö¿¡¼­´Â DaemonÀÇ Æ¯Â¡°ú °£´ÜÇÑ Daemon ÇÁ·Î¼¼½º¸¦ ¸¸µé¾î º¸µµ·Ï ÇÏ°Ú´Ù. == DeamonÀÇ Æ¯Â¡ == ÀϹÝÀûÀ¸·Î DaemonÀ» ´Ü¼øÈ÷ ½Ã½ºÅÛ ¹é±×¶ó¿îµå¿¡¼­ µ¹¾Æ°¡°í ÀÖ´Â ÇÁ·Î¼¼½º¶ó »ý°¢Çϱ⠽±´Ù. ¾Æ·¡ÀÇ È­¸éÀ» º¸°í Daemon°ú ÀÏ¹Ý ¹é±×¶ó¿î ÇÁ·Î¼¼½ºÀÇ Â÷À̸¦ ¾Ë¾Æ º¸µµ·Ï ÇÏÀÚ. (°¡Àå ¹Ø¿¡ ÀÖ´Â ÇÁ·Î¼¼½º°¡ ÇÊÀÚ°¡ ¶ç¿î ¹é±×¶ó¿îµå ÇÁ·Î¼¼½º´Ù) {{{ [Test]$ ps -axj | more PPID PID PGID SID TTY TPGID STAT UID TIME COMMAND 1 4 1 1 ? -1 SW 0 0:04 [keventd] 1 7 1 1 ? -1 SW 0 8:25 [kswapd] 2182 2382 2382 2182 pts/13 2400 S 528 0:00 ./test_proc }}} À§ÀÇ °á°ú´Â test_proc¶ó´Â ¹«ÇÑ ·çÇÁ¸¦ µµ´Â ÇÁ·Î±×·¥À» ¹é±×¶ó¿îµå·Î ½ÇÇà ½ÃÅ°°í ³­ÈÄ, ÇöÀç ½Ã½ºÅÛ À§¿¡¼­ µ¹¾Æ°¡°í ÀÖ´Â ÇÁ·Î¼¼½ºµéÀÇ PPID¿Í PID, PGID¸¦ Ãâ·Â Çغ» °ÍÀÌ´Ù. °á°ú¿¡¼­ ¾Ë ¼ö ÀÖ´Ù½ÃÇÇ DaemonµéÀº ù° TTY(Å͹̳ΠÀåÄ¡)¸¦ °¡Áö°í ÀÖÁö ¾Ê´Ù. µÑ° PPID(parent id)°¡ 1·Î ¼¼ÆõǾî ÀÖÀ¸¸ç SID(session id)¿ª½Ã ÀÚ½ÅÀÇ ¾ÆÀ̵ð¿Í °°´Ù. == Coding rule == À§¿¡¼­ ¾ð±Þ ÇßµíÀÌ DaemonÀº ÀÏ¹Ý ÇÁ·Î¼¼½º¿Í´Â ´Ù¸¥ ¸î °¡Áö Ư¡À» °¡Áö°í ÀÖ´Ù°í Çß´Ù. DaemonÀ» ¸¸µé±â Àü¿¡ DaemonÀÇ Æ¯Â¡À» ÀÚ¼¼È÷ Áý°í ³Ñ¾î °¡µµº¸·Ï ÇÏÀÚ. === ÆÄÀÏÀ» ¸¸µé¶© umask ¼³Á¤! === ¼³¸íÀ» ÇϱâÀü¿¡ ¾Æ·¡ÀÇ °á°ú È­¸éÀ» ¸ÕÀú º¸µµ·Ï ÇÏÀÚ. {{{ [Test]$ umask 0002 [Test]$ touch test_umask [Test]$ ls -la ÇÕ°è 8 drwxrwxr-x 2 kukuta kukuta 4096 10¿ù 17 21:36 . drwxr-xr-x 9 kukuta kukuta 4096 10¿ù 17 21:14 .. -rw-rw-r-- 1 kukuta kukuta 0 10¿ù 17 21:36 test_umask [Test]$ umask 0 [Test]$ touch test_umask_zero [Test]$ ls -la ÇÕ°è 8 drwxrwxr-x 2 kukuta kukuta 4096 10¿ù 17 21:37 . drwxr-xr-x 9 kukuta kukuta 4096 10¿ù 17 21:14 .. -rw-rw-r-- 1 kukuta kukuta 0 10¿ù 17 21:36 test_umask -rw-rw-rw- 1 kukuta kukuta 0 10¿ù 17 21:37 test_umask_zero }}} ¸¸ÀÏ DaemonÀÌ ÆÄÀÏÀ» »ý¼ºÇϴµ¥, ±× ÆÄÀÏÀÌ ¾Æ¹«µµ ÀÐÀ» ¼öµµ, ¼öÁ¤ ÇÒ ¼öµµ ¾ø´Â ÆÄÀÏÀ̶ó¸é ¹®Á¦°¡ ÀÖ´Â °ÍÀÌ´Ù. DaemonÀÌ ÆÄÀÏÀ» »ý¼ºÇØ¾ß ÇÒ ÇÊ¿ä ¼ºÀÌ ÀÖ´Ù¸é umask ÇÔ¼ö¸¦ »ç¿ëÇÏ¿© DaemonÀÌ »ý¼ºÇÏ´Â ÆÄÀÏÀÇ Á¢±Ù ±ÇÇÑÀ» ¹Ì¸® ¼³Á¤ ÇØ µÎÀÚ. === fork()¸¦ ÀÌ¿ëÇÏ¿© PPID¸¦ 1·Î! === À§¿¡¼­ ¾ð±ÞÇß´Ù ½ÍÀÌ DaemonÀÇ Æ¯Â¡ Áß¿¡ Çϳª°¡ PPID°¡ 1(init)¶ó´Â °ÍÀÌ´Ù. ¿©±â¼­ ¿ì¸®°¡ ±â¾ïÇØ¾ß ÇÒ °ÍÀº, ÇÑ ÇÁ·Î¼¼½º°¡ ÀÚ½Ä ÇÁ·Î¼¼½º¸¦ ¸¸µé°í, ÀÚ½Ä ÇÁ·Î¼¼½º°¡ ¼Ò¸ê µÇ±âµµ Àü¿¡ ºÎ¸ð°¡ Á×¾î ¹ö¸°´Ù¸é, ÀÚ½Ä ÇÁ·Î¼¼½º´Â initÇÁ·Î¼¼½º¿¡°Ô ÀÔ¾çµÇ¸ç, ±× initÀÇ PID°¡ 1À̶ó´Â °ÍÀÌ´Ù. ±×¸®°í fork()°¡ µÉ°æ¿ì ÀÚ½Ä ÇÁ·Î¼¼½º´Â »õ·Î¿î ÇÁ·Î¼¼½º ¾ÆÀ̵𸦠¹ÞÁö¸¸, ±×·ì ¾ÆÀ̵ð´Â ºÎ¸ðÀÇ °ÍÀ» ±×´ë·Î »ó¼Ó ¹Þ°Ô µÈ´Ù. ÇѸ¶µð·Î ±×·ìÀÇ ¸®´õ°¡ ¾Æ´Ï¶ó´Â ¸»ÀÌ´Ù. ÀÌ·¸°Ô ºÎ¸ð ÇÁ·Î¼¼½º¸¦ Á×ÀÌ´Â °ÍÀº ´ÙÀ½¿¡ ³ª¿Ã ±×·ìÀÇ ¸®´õ°¡ µÇ±â À§ÇÑ setsid()È£ÃâÀÇ ÇʼöºÒ°¡°áÇÑ Á¶°ÇÀÌ´Ù. (ºñÁ¤ÇÑ ÇÁ·Î¼¼½ºÀÇ ¼¼»óÀÌ´Ù. ±×·ìÀÇ ¸®´õ°¡ µÇ±â À§ÇØ ºÎ¸ð¸¦ Á×ÀÌ´Ù´Ï...¤Ð¤Ð) === »õ·Î¿î SessionÀ»À§ÇØ setsid()¸¦.. === setsid ÇÔ¼ö´Â È£ÃâÇÏ´Â ÇÁ·Î¼¼½º°¡ ±×·ìÀÇ ¸®´õ°¡ ¾Æ´Ò¶§ »õ·Î¿î ¼¼¼ÇÀ» »ý¼ºÇÏ¿© ´ÙÀ½°ú °°Àº ¼¼ °¡Áö ÀÏÀ» ÇÑ´Ù. 1. È£ÃâÇÑ ÇÁ·Î¼¼½º´Â »õ·Î¿î ¼¼¼ÇÀÇ ¸®´õ°¡ µÈ´Ù. 2. È£ÃâÇÑ ÇÁ·Î¼¼½º´Â »õ·Î¿î ±×·ìÀÇ ¸®´õ°¡ µÈ´Ù. 3. ÇÁ·Î¼¼½º´Â ÄÁÆ®·Ñ Å͹̳ÎÀ» ÀÒ¾î ¹ö¸®°Ô µÈ´Ù(¾ðÁ¦³ª ¾òÀ» ¼ö¸¸Àº ¾ø´Ù) ¡Ø session À̶õ ? Çϳª ¶Ç´Â ÀÌ»óÀÇ ÇÁ·Î¼¼½º ±×·ìµéÀÇ ÁýÇÕÀÌ´Ù. === »õ·Î¿î µð·ºÅ丮¸¦ ã¾Æ¼­.. === chdirÀ» ÀÌ¿ëÇÏ¿© ÇöÀç ¿öÅ· µð·ºÅ丮¸¦ ·çÆ® µð·ºÅ丮(/)·Î º¯°æÇÑ´Ù. ºÎ¸ð·Î ¹°·Á ¹ÞÀº ¿öÅ· µð·ºÅ丮´Â ÆÄÀÏ ½Ã½ºÅÛ¿¡ ¸¶¿îÆ® µÇ¾î ÀÖ´Â °ÍÀÏ ¼öµµ ÀÖ°í, ½Ã½ºÅÛÀÌ Á¤Áö ÇÒ¶§ ±îÁö »ì¾Æ ÀÖ´Â DaemonÀÇ Æ¯¼º ¶§¹®¿¡ ÆÄÀÏ ½Ã½ºÅÛÀÌ ¾ð¸¶¿îÆ® µÇÁö ¾ÊÀ» ¼öµµ ÀÖ´Ù. === ÇÊ¿ä ÇÏÁö ¾ÊÀº ÆÄÀÏ µð½ºÅ©¸³ÅÍ´Â ¸ðµÎ Á×Àδ٠=== DaemonÀÇ Æ¯Â¡ Áß¿¡ Çϳª´Â ÄÁÆ®·Ñ Å͹̳ÎÀ» °¡ÁöÁö ¾Ê´Â °ÍÀÌ´Ù. ÀÌ´Â ½Ã½ºÅÛÀÌ ½ÃÀÛÇÒ ¶§ ¾Æ¹«µµ ¸ô·¡ ½ÇÇàµÇ¾î ½Ã½ºÅÛÀÌ Á×À» ¶§ ±× ¿î¸íÀ» °°ÀÌ ÇÏ´Â DaemonÀ» »ç¿ëÀÚµéÀÌ ±ÄÀÌ ¾Ö½á ¾ËÇÊ¿äµµ ¾ø°í, ÄÁÆ®·Ñ ÇØÁà¾ß ÇÒ ÇÊ¿äµµ ¾ø´Â °ÍÀ̱⠶§¹®ÀÌ´Ù. Daemon¿¡°Ô ¿©·¯ ÇÊ¿ä ¾ø´Â ÆÄÀÏ µð½ºÅ©¸³Å͵éÀ» ¹°¸°´Ù´Â °ÍÀº ÀÚ¿øÀÇ ³¶ºñ¿ä, Çà¿© ¸ð¸¦ ¿À·ùÀÇ ¿øÀÎÀÌ µÈ´Ù. === Á×Áö ¾Ê´Â ÆÄÀÏ µð½ºÅ©¸³ÅÍ´Â /dev/null¿¡ ¹°¸°´Ù === DaemonÀº Å͹̳Πµð¹ÙÀ̽º ÀÚü¸¦ °¡Áö°í ÀÖÁö ¾Ê´Ù. ±×·¸±â¿¡ 0, 1, 2 ¹ø ÆÄÀÏ µð½ºÅ©¸³ÅÍ Ã³·³, Å͹̳ΰú Åë½ÅÀ» ÇÏ´Â °ÍµéÀº ¾Æ¹«·± ¿µÇâÀ» ÁÙ ¼ö ¾ø´Â /dev/null·Î º¸³» ¹ö¸°´Ù. == Daemonize function == {{{ #include #include #include #include #include #include #include #include #include #include void daemonize(const char* cmd) { /* * set file creation mask to 0 */ umask(0); /* * Get maximum number of file descriptors */ rlimit rl; if(getrlimit(RLIMIT_NOFILE, &rl) < 0) { std::cerr << "error getlimit" << std::endl; } pid_t pid; /* * Become a session leader to loase controlling TTY */ if((pid = fork()) < 0) { std::cerr << "error fork" << std::endl; } else if(pid != 0) // parent process { exit(0); } setsid(); struct sigaction sa; /* * ensure future open won't allocate controlling TTYs. */ sa.sa_handler = SIG_IGN; sigemptyset(&sa.sa_mask); sa.sa_flags = 0; if(sigaction(SIGHUP, &sa, NULL) < 0) { std::cerr << "can't ignore SIGHUP" << std::endl; } if(chdir("/") < 0) { std::cerr << "can't change directory " << std::endl; } /* * Close all file descriptors */ if(rl.rlim_max == RLIM_INFINITY) { rl.rlim_max = 1024; } for(int i=0; i