· KLDP.org · KLDP.net · KLDP Wiki · KLDP BBS ·
daemon

ÁöÀºÀÌ : kukuta@gmail.com Âü°í : Advenced Programming in Unix Environment

1. Daemon À̶õ?

DaemonÇÁ·Î¼¼½º´Â ½Ã½ºÅÛ ½ÃÀÛÀÌ ½ÃÀÛÇÒ ¶§ ±× »ý¸íÀ» ½ÃÀÛÇÏ¿©, ¿ì¸®°¡ ¾ËÁö ¸øÇÏ´Â ¹é±×¶ó¿îµå¿¡¼­ ÀÚ½ÅÀÇ ÇÒÀÏÀ» ¹¬¹¬È÷ ÇàÇÏ´Ù, ½Ã½ºÅÛ°ú ÇÔ²² ±× »ý¸íÀ» ´ÙÇÑ´Ù. ÀÌ ÆäÀÌÁö¿¡¼­´Â DaemonÀÇ Æ¯Â¡°ú °£´ÜÇÑ Daemon ÇÁ·Î¼¼½º¸¦ ¸¸µé¾î º¸µµ·Ï ÇÏ°Ú´Ù.

2. 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)¿ª½Ã ÀÚ½ÅÀÇ ¾ÆÀ̵ð¿Í °°´Ù.

3. Coding rule

À§¿¡¼­ ¾ð±Þ ÇßµíÀÌ DaemonÀº ÀÏ¹Ý ÇÁ·Î¼¼½º¿Í´Â ´Ù¸¥ ¸î °¡Áö Ư¡À» °¡Áö°í ÀÖ´Ù°í Çß´Ù. DaemonÀ» ¸¸µé±â Àü¿¡ DaemonÀÇ Æ¯Â¡À» ÀÚ¼¼È÷ Áý°í ³Ñ¾î °¡µµº¸·Ï ÇÏÀÚ.

3.1. ÆÄÀÏÀ» ¸¸µé¶© 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ÀÌ »ý¼ºÇÏ´Â ÆÄÀÏÀÇ Á¢±Ù ±ÇÇÑÀ» ¹Ì¸® ¼³Á¤ ÇØ µÎÀÚ.

3.2. fork()¸¦ ÀÌ¿ëÇÏ¿© PPID¸¦ 1·Î!

À§¿¡¼­ ¾ð±ÞÇß´Ù ½ÍÀÌ DaemonÀÇ Æ¯Â¡ Áß¿¡ Çϳª°¡ PPID°¡ 1(init)¶ó´Â °ÍÀÌ´Ù. ¿©±â¼­ ¿ì¸®°¡ ±â¾ïÇØ¾ß ÇÒ °ÍÀº, ÇÑ ÇÁ·Î¼¼½º°¡ ÀÚ½Ä ÇÁ·Î¼¼½º¸¦ ¸¸µé°í, ÀÚ½Ä ÇÁ·Î¼¼½º°¡ ¼Ò¸ê µÇ±âµµ Àü¿¡ ºÎ¸ð°¡ Á×¾î ¹ö¸°´Ù¸é, ÀÚ½Ä ÇÁ·Î¼¼½º´Â initÇÁ·Î¼¼½º¿¡°Ô ÀÔ¾çµÇ¸ç, ±× initÀÇ PID°¡ 1À̶ó´Â °ÍÀÌ´Ù. ±×¸®°í fork()°¡ µÉ°æ¿ì ÀÚ½Ä ÇÁ·Î¼¼½º´Â »õ·Î¿î ÇÁ·Î¼¼½º ¾ÆÀ̵𸦠¹ÞÁö¸¸, ±×·ì ¾ÆÀ̵ð´Â ºÎ¸ðÀÇ °ÍÀ» ±×´ë·Î »ó¼Ó ¹Þ°Ô µÈ´Ù. ÇѸ¶µð·Î ±×·ìÀÇ ¸®´õ°¡ ¾Æ´Ï¶ó´Â ¸»ÀÌ´Ù. ÀÌ·¸°Ô ºÎ¸ð ÇÁ·Î¼¼½º¸¦ Á×ÀÌ´Â °ÍÀº ´ÙÀ½¿¡ ³ª¿Ã ±×·ìÀÇ ¸®´õ°¡ µÇ±â À§ÇÑ setsid()È£ÃâÀÇ ÇʼöºÒ°¡°áÇÑ Á¶°ÇÀÌ´Ù. (ºñÁ¤ÇÑ ÇÁ·Î¼¼½ºÀÇ ¼¼»óÀÌ´Ù. ±×·ìÀÇ ¸®´õ°¡ µÇ±â À§ÇØ ºÎ¸ð¸¦ Á×ÀÌ´Ù´Ï...¤Ð¤Ð)

3.3. »õ·Î¿î SessionÀ»À§ÇØ setsid()¸¦..

setsid ÇÔ¼ö´Â È£ÃâÇÏ´Â ÇÁ·Î¼¼½º°¡ ±×·ìÀÇ ¸®´õ°¡ ¾Æ´Ò¶§ »õ·Î¿î ¼¼¼ÇÀ» »ý¼ºÇÏ¿© ´ÙÀ½°ú °°Àº ¼¼ °¡Áö ÀÏÀ» ÇÑ´Ù.
  1. È£ÃâÇÑ ÇÁ·Î¼¼½º´Â »õ·Î¿î ¼¼¼ÇÀÇ ¸®´õ°¡ µÈ´Ù.
  2. È£ÃâÇÑ ÇÁ·Î¼¼½º´Â »õ·Î¿î ±×·ìÀÇ ¸®´õ°¡ µÈ´Ù.
  3. ÇÁ·Î¼¼½º´Â ÄÁÆ®·Ñ Å͹̳ÎÀ» ÀÒ¾î ¹ö¸®°Ô µÈ´Ù(¾ðÁ¦³ª ¾òÀ» ¼ö¸¸Àº ¾ø´Ù)
¡Ø session À̶õ ?
Çϳª ¶Ç´Â ÀÌ»óÀÇ ÇÁ·Î¼¼½º ±×·ìµéÀÇ ÁýÇÕÀÌ´Ù.

3.4. »õ·Î¿î µð·ºÅ丮¸¦ ã¾Æ¼­..

chdirÀ» ÀÌ¿ëÇÏ¿© ÇöÀç ¿öÅ· µð·ºÅ丮¸¦ ·çÆ® µð·ºÅ丮(/)·Î º¯°æÇÑ´Ù. ºÎ¸ð·Î ¹°·Á ¹ÞÀº ¿öÅ· µð·ºÅ丮´Â ÆÄÀÏ ½Ã½ºÅÛ¿¡ ¸¶¿îÆ® µÇ¾î ÀÖ´Â °ÍÀÏ ¼öµµ ÀÖ°í, ½Ã½ºÅÛÀÌ Á¤Áö ÇÒ¶§ ±îÁö »ì¾Æ ÀÖ´Â DaemonÀÇ Æ¯¼º ¶§¹®¿¡ ÆÄÀÏ ½Ã½ºÅÛÀÌ ¾ð¸¶¿îÆ® µÇÁö ¾ÊÀ» ¼öµµ ÀÖ´Ù.

3.5. ÇÊ¿ä ÇÏÁö ¾ÊÀº ÆÄÀÏ µð½ºÅ©¸³ÅÍ´Â ¸ðµÎ Á×ÀδÙ

DaemonÀÇ Æ¯Â¡ Áß¿¡ Çϳª´Â ÄÁÆ®·Ñ Å͹̳ÎÀ» °¡ÁöÁö ¾Ê´Â °ÍÀÌ´Ù. ÀÌ´Â ½Ã½ºÅÛÀÌ ½ÃÀÛÇÒ ¶§ ¾Æ¹«µµ ¸ô·¡ ½ÇÇàµÇ¾î ½Ã½ºÅÛÀÌ Á×À» ¶§ ±× ¿î¸íÀ» °°ÀÌ ÇÏ´Â DaemonÀ» »ç¿ëÀÚµéÀÌ ±ÄÀÌ ¾Ö½á ¾ËÇÊ¿äµµ ¾ø°í, ÄÁÆ®·Ñ ÇØÁà¾ß ÇÒ ÇÊ¿äµµ ¾ø´Â °ÍÀ̱⠶§¹®ÀÌ´Ù. Daemon¿¡°Ô ¿©·¯ ÇÊ¿ä ¾ø´Â ÆÄÀÏ µð½ºÅ©¸³Å͵éÀ» ¹°¸°´Ù´Â °ÍÀº ÀÚ¿øÀÇ ³¶ºñ¿ä, Çà¿© ¸ð¸¦ ¿À·ùÀÇ ¿øÀÎÀÌ µÈ´Ù.

3.6. Á×Áö ¾Ê´Â ÆÄÀÏ µð½ºÅ©¸³ÅÍ´Â /dev/null¿¡ ¹°¸°´Ù

DaemonÀº Å͹̳Πµð¹ÙÀ̽º ÀÚü¸¦ °¡Áö°í ÀÖÁö ¾Ê´Ù. ±×·¸±â¿¡ 0, 1, 2 ¹ø ÆÄÀÏ µð½ºÅ©¸³ÅÍ Ã³·³, Å͹̳ΰú Åë½ÅÀ» ÇÏ´Â °ÍµéÀº ¾Æ¹«·± ¿µÇâÀ» ÁÙ ¼ö ¾ø´Â /dev/null·Î º¸³» ¹ö¸°´Ù.

4. Daemonize function

#include <fcntl.h>
#include <iostream>
#include <signal.h>
#include <string>
#include <syslog.h>
#include <unistd.h>
#include <sys/resource.h>
#include <sys/stat.h>
#include <sys/time.h>
#include <sys/types.h>

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<rl.rlim_max; i++)
    {
        close(i);
    }

    /*
     * Attach file descriptors 0, 1, and 2 to /dev/null
     */
    int fd0, fd1, fd2;
    fd0 = open("/dev/null", O_RDWR);
    fd1 = dup(0);
    fd2 = dup(0);

    /*
     * Initialize the log file
     */
    openlog(cmd, LOG_CONS, LOG_DAEMON);

    if(fd0 != 0 || fd1 != 1 || fd2 != 2)
    {
        syslog(LOG_ERR, "unexpected file descriptors %d %d %d", fd0, fd1, fd2);
        exit(1);
    }
    closelog();
}




sponsored by andamiro
sponsored by cdnetworks
sponsored by HP

Valid XHTML 1.0! Valid CSS! powered by MoniWiki
last modified 2008-07-30 05:35:05
Processing time 0.0049 sec