· 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();
}


ID
Password
Join
As goatheard learns his trade by goat, so writer learns his trade by wrote.


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.0050 sec