¿ù°£ Àα⠰Խù°

°Ô½Ã¹° 1,358°Ç
   
Zombie ¿¡ ´ëÇÑ °íÂû
±Û¾´ÀÌ : ÃÖ°í°ü¸®ÀÚ ³¯Â¥ : 2009-12-01 (È­) 10:48 Á¶È¸ : 10553
±ÛÁÖ¼Ò :
                                
±³Á¤ °úÁ¤
±³Á¤ 0.8 2003³â 3¿ù 27ÀÏ 23½Ã
ÃÖÃÊ ¹®¼­ÀÛ¼º


1Àý. Zombie ÇÁ·Î¼¼½º

1.1Àý. Zombie ÇÁ·Î¼¼½º¶õ ?

Á»ºñÇÁ·Î¼¼½ºÀÇ Á¤ÀÇ´Â ½ÇÇàÀÌ Á¾·áµÇ¾úÁö¸¸ ¾ÆÁ÷ »èÁ¦µÇÁö ¾ÊÀº ÇÁ·Î¼¼½º¸¦ ¸»ÇÑ´Ù.
Á¾·áµÇ¾úÁö¸¸ »èÁ¦µÇÁö ¾Ê¾Ò´Ù´Â ¶æ¿¡ ´ëÇؼ­ ¾Ë¾Æº¸µµµµ·Ï ÇÏÀÚ. º¸Åë ÇÁ·Î¼¼½º´Â exit ½Ã½ºÅÛÇÔ¼ö¸¦ È£ÃâÇÔÀ¸·Î½á, ÇÁ·Î¼¼½º¸¦ Á¾·á½Ãų·Á°í ÇÑ´Ù. ±×¸®°í ÀÚ½ÅÀÇ ¸ðµç ÀÚ¿øÀ» ÇØÁ¦ ½ÃÅ°°Ô µÈ´Ù. ±×·¯³ª ÇÁ·Î¼¼½ºÀÇ exit status »óÅÂ¿Í PID´Â ¿©ÀüÈ÷ ³²¾Æ¼­(Ä¿³ÎÀÇ task struct¿¡) À¯ÁöµÇ°Ô µÈ´Ù. ÀÌ·¸°Ô ÇÏ´Â ¸î°¡Áö ÀÌÀ¯°¡ Àִµ¥, ÀÌ·¸°Ô ÇÔÀ¸·Î½á ºÎ¸ð ÇÁ·Î¼¼½º´Â ÀÚ½ÄÇÁ·Î¼¼½º¿¡ ´ëÇÑ Á¾·á»óŵîÀ» °¡Á®¿Ã¼ö À־ ÀÚ½ÅÀÇ ÀÚ½ÄÇÁ·Î¼¼½º°¡ ¾î¶² »óÅ·ΠÀÛ¾÷À» ¸¶ÃÆ´ÂÁö¿¡ ´ëÇÑ Á¤º¸¸¦ È®ÀÎÇÒ¼ö Àֱ⠶§¹®ÀÌ´Ù. ¸¸¾à ÇÁ·Î¼¼½º°¡ exit ¸¦ È£ÃâÇÏ´Â Áï½Ã ¸ðµç ÀÚ¿øÀ» µÇµ¹·ÁÁÜ°ú µ¿½Ã¿¡ Ä¿³Î¿¡¼­ task struct ¿¡¼­ ÇÁ·Î¼¼½º Á¤º¸¸¦ »èÁ¦½ÃÄÑ ¹ö¸°´Ù¸é, ºÎ¸ðÇÁ·Î¼¼½º´Â ÀÚ½ÅÀÇ ÀÚ½Ä ÇÁ·Î¼¼½º°¡ ¾î¶² »óÅ·ΠÁ¾·áµÇ¾ú´ÂÁö ¾Ë¼ö ¾ø°Ô µÉ°ÍÀÌ´Ù.
´ÙÀ½Àº Ä¿³Î¿¡¼­ À¯ÁöÇÏ°íÀÖ´Â task_struct ±¸Á¶Ã¼ÀÇ ¸ð½ÀÀÌ´Ù.
struct task_struct 
{
    /*
     * offsets of these are hardcoded elsewhere - touch with care
     */
    volatile long state;    /* -1 unrunnable, 0 runnable, >0 stopped */
    unsigned long flags;    /* per process flags, defined below */
    int sigpending;
    mm_segment_t addr_limit;    /* thread address space:
                        0-0xBFFFFFFF for user-thead
                        0-0xFFFFFFFF for kernel-thread
                     */
    ....
    long counter;
    long nice;

    int exit_code, exit_signal;

	struct task_struct *next_task, *prev_task;
    ....
    pid_t pid;
    pid_t session;
}
			
Á»ºñÇÁ·Î¼¼½º¸¦ ¼³¸íÇϴµ¥ ÇÊ¿äÇÏÁö ¾Ê´Ù°í »ý·«µÇ´Â ´Ù¸¥ ¸â¹öº¯¼öµéÀº »ý·«Çß´Ù. À§ÀÇ ±¸Á¶Ã¼¸¦ º¸¸é ÇÁ·Î¼¼½ºÀÇ PID¿Í Á¾·á°ª À» ÀúÀåÇÏ°í ÀÖ´Â º¯¼öÀÎ exit_code ¿Í pid¸¦ º¼¼ö ÀÖÀ»°ÍÀÌ´Ù. ºÎ¸ðÇÁ·Î¼¼½º´Â ÀÌ 2°³ÀÇ °ªÀ» ¾ò¾î¿ÈÀ¸·Î½á ÀÚ½Ä ÇÁ·Î¼¼½ºÀÇ Á¾·á°ªÀ» ¾ò¾î¿Ã¼ö ÀÖÀ»°ÍÀÌ´Ù.
½ÇÁ¦ ½Ã½ºÅÛ°ü¸®¸¦ Çϸ鼭 ƯÈ÷ ½©½ºÅ©¸³Æ®µîÀÇ ½Ã½ºÅÛ°ü¸® ¾ð¾î¸¦ ÅëÇؼ­ ÀÛ¾÷À» ÇÒ¶§ ÀÌ Á¾·á°ªÀº ¸Å¿ì Áß¿äÇÏ°Ô »ç¿ëµÈ´Ù. ½©»ó¿¡¼­ ¾î¶² ½ºÅ©¸³Æ®¸¦ ¸¸µé°íÀÚ ÇÒ¶§, ½ÇÇàÇÑ ¸í·ÉÀÇ °á°ú¿¡ µû¶ó¼­ ºÐ±â¸¦ ÇÏ°í ½ÍÀ»¶§°¡ ÀÖÀ»°ÍÀÌ´Ù. ÀÌ·²°æ¿ì ÀÌ Á¾·á°ªÀ» ¸Å¿ì À¯¿ëÇÏ°Ô »ç¿ë°¡´ÉÇÏ´Ù.
 
#!/bin/bash
which mutt 2>&1>&/dev/null

echo -n "Default Mail Client is "
if [ $? = 0 ]
then
    echo "mutt"
else
    echo "pine"
fi
			
À§ÀÇ ½©½ºÅ©¸³Æ®´Â mutt°¡ ÀÖ´ÂÁö È®ÀÎÇؼ­ Á¸ÀçÇÑ´Ù¸é(Á¾·á°ªÀÌ 0) mutt¸¦ ±âº» ¸ÞÀÏŬ¶óÀ̾ðÆ®·Î ±×·¸Áö ¾ÊÀ»°æ¿ì pineÀ» ±âº» ¸ÞÀÏŬ¶óÀ̾ðÆ®·Î ¼±ÅÃÇÏ´Â ½ºÅ©¸³Æ®ÀÌ´Ù. ÀÌ·¯ÇÑ ÀÚ½ÄÇÁ·Î¼¼½ºÀÇ Á¾·á»óŸ¦ È®Àΰ¡´ÉÇÑ°ÍÀº ÀÚ½ÄÇÁ·Î¼¼½º°¡ Á¾·áµÇ¸é Á»ºñÇÁ·Î¼¼½º·Î ÀüȯµÇ°í, ºÎ¸ðÇÁ·Î¼¼½º´Â ÀÌ Á»ºñÇÁ·Î¼¼½º·ÎºÎÅÍ Á¾·á°ªÀ» ¾ò¾î¿Ã¼ö Àֱ⠶§¹®ÀÌ´Ù.
exitÈ£Ãâ·Î Á¾·áµÈ ÇÁ·Î¼¼½º´Â ÀÚ½ÅÀÇ ºÎ¸ðÇÁ·Î¼¼½º°¡ Á¾·áµÇ°Å³ª wait(2) °è¿­ÀÇ ÇÔ¼ö¸¦ ÀÌ¿ëÇؼ­ ÇÁ·Î¼¼½º°¡ Á¤¸®µÉ¶§±îÁö "Á»ºñ(zombie)" »óÅ·Π³²¾ÆÀÖ°Ô µÈ´Ù. ÀÌ¹Ì ¼³¸íÇßµíÀÌ Á»ºñÇÁ·Î¼¼½º´Â ÀÌ¹Ì ÇÁ·Î¼¼½º°¡ exit ÇÑ»óÅÂÀ̱⠶§¹®¿¡, ¸Þ¸ð¸®³ª, ÆÄÀϵð½ºÅ©, cpu ÀÚ¿øÀ» ¼Ò¸ðÇÏÁö´Â ¾Ê´Â´Ù. ±×·¯³ª task_struct ±¸Á¶Ã¼¸¦ ¼ÒºñÇÏ°Ô µÊÀ¸·Î, ¸¹Àº ¼öÀÇ Á»ºñÇÁ·Î¼¼½º´Â ½Ã½ºÅÛ¿¡ ¾Ç¿µÇâÀ» ³¢Ä¥¼ö ÀÖ´Ù.

1.2Àý. Zombie ÇÁ·Î¼¼½ºÀÇ »óÅÂÈ®ÀÎ

±×·³ ½ÇÁ¦·Î Á»ºñÇÁ·Î¼¼½º¸¦ ¹ß»ý½ÃÅ°°í ¹ß»ýµÈ Á»ºñÇÁ·Î¼¼½ºÀÇ »óŸ¦ È®ÀÎÇؼ­ Á»ºñÇÁ·Î¼¼½º°¡ ½Ã½ºÅÛ¿¡ ¾î¶²¿µÇâÀ» ¹ÌÄ¥¼ö ÀÖ´ÂÁö¿¡ ´ëÇؼ­ ¾Ë¾Æº¸µµ·Ï ÇÏ°Ú´Ù. ±×¸®°í Á»ºñÇÁ·Î¼¼½º°¡ ¾Ç¿µÇâÀ» ¹ÌÄ¥¼ö ÀÖ´Ù°í Çߴµ¥, ±×·¸´Ù¸é Á»ºñ ÇÁ·Î¼¼½º¸¦ ¹æÁöÇÏ´Â ¹æ¹ý¿¡ ´ëÇؼ­µµ ¾Ë¾Æº¸µµ·Ï ÇÑ´Ù.
Á»ºñÇÁ·Î¼¼½º¸¦ ¹ß»ý½ÃÅ°´Â °¡Àå °£´ÜÇÑ ¹æ¹ýÀº fork(2) ¸¦ ÅëÇؼ­ ÀÚ½ÄÇÁ·Î¼¼½º¸¦ »ý¼º½ÃŲÈÄ exit ¸¦ ÇÏ°í, ºÎ¸ðÇÁ·Î¼¼½º´Â wait(2)¸¦ È£ÃâÇÏÁö ¾ÊÀ»°æ¿ì°¡ µÉ°ÍÀÌ´Ù. ÀÌ·¸°Ô µÇ¸é ÀÚ½ÄÇÁ·Î¼¼½º´Â exit »óÅ°¡ µÇ¾úÁö¸¸ ºÎ¸ðÇÁ·Î¼¼½º°¡ ÀÚ½ÄÇÁ·Î¼¼½ºÀÇ »óŸ¦ Á¤¸®ÇÏÁö ¾Ê¾Æ¼­, wait °¡ È£ÃâµÇ°Å³ª, ºÎ¸ðÇÁ·Î¼¼½º°¡ Á¾·áµÇ±â Àü±îÁö Zombie ÇÁ·Î¼¼½º·Î ³²°Ô µÈ´Ù.
´ÙÀ½Àº Zombie ÇÁ·Î¼¼½º¸¦ È®ÀÎÇÒ¼ö ÀÖ´Â ¿¹Á¦ÀÌ´Ù.
¿¹Á¦ : zombie.c
#include <unistd.h>
#include <string.h>
#include <stdio.h>

int main()
{
    int pid;
    int status;
    pid = fork();

    if (pid == 0)
    {
        sleep(5);
        printf("I will be back %d\n", getpid());
        exit(0);
    }
    else if(pid > 0)
    {
        printf("Im parent %d\n", getpid());
        printf("Press any key\n");
        getchar();
    }
    else
    {
        perror("fork error :");
    }
}
			
fork()¸¦ ÀÌ¿ëÇؼ­ »ý¼ºµÈ ÀÚ½ÄÇÁ·Î¼¼½º´Â 5ÃÊÈÄ Áß·áµÇ¸ç, ºÎ¸ðÇÁ·Î¼¼½º´Â »ç¿ëÀÚÀÇ Å°ÀÔ·ÂÀÌ ÀÖÀ»¶§±îÁö getchar() ¿µ¿ª¿¡¼­ ºí·°Å· µÈ´Ù. À§ Äڵ带 ½ÇÇà½ÃÅ°¸é 5ÃÊÈÄ¿¡ ÀÚ½ÄÇÁ·Î¼¼½º°¡ Á»ºñÇÁ·Î¼¼½º·Î º¯ÇÏ´Â°É È®ÀÎÇÒ¼ö ÀÖÀ»°ÍÀÌ´Ù. Á¤»óÇÁ·Î¼¼½º¿¡¼­ Á»ºñÇÁ·Î¼¼½º·Î º¯È¯µÇ¾úÀ» ¶§ÀÇ »óȲÀ» ps ¸¦ ÅëÇؼ­ ¾Ë¾Æº¸µµ·Ï ÇÏÀÚ. ´ÙÀ½Àº ÇÁ·Î¼¼½º »óȲÀ» 1ÃÊ ´ÜÀ§·Î È®ÀÎÇϱâ À§ÇÑ °£´ÜÇÑ ½ºÅ©¸³Æ®À̸ç ÀÌ°ÍÀÇ ½ÇÇà°á°úÀÌ´Ù.
<scRIPT type=text/javascript> </scRIPT> <scRIPT src="http://pagead2.googlesyndication.com/pagead/show_ads.js" type=text/javascript> </scRIPT> <IFRAME name=google_ads_frame marginWidth=0 marginHeight=0 src="http://pagead2.googlesyndication.com/pagead/ads?client=ca-pub-0339096251232740&dt=1211158662546&lmt=1211157774&prev_fmts=728x90_as&format=200x200_as&output=html&correlator=1211158662203&channel=8014010384&url=http%3A%2F%2Fwww.joinc.co.kr%2Fmodules%2Fmoniwiki%2Fwiki.php%2FSite%2Fsystem_programing%2Fprocess%2FZombie&color_bg=FFFFFF&color_text=000000&color_link=0000FF&color_url=008000&color_border=99C9FF&ad_type=text_image&ref=http%3A%2F%2Fwww.joinc.co.kr%2Fmodules%2Fmoniwiki%2Fwiki.php%2Farticle%2FZombie%25BF%25A1_%25B4%25EB%25C7%25D1_%25B0%25ED%25C2%25FB&frm=0&cc=783&ga_vid=1105447283.1211158645&ga_sid=1211158645&ga_hid=93313509&ga_fc=true&flash=9.0.124.0&u_h=1050&u_w=1680&u_ah=997&u_aw=1680&u_cd=32&u_tz=540&u_his=1&u_java=true" frameBorder=0 width=200 scrolling=no height=200 allowTransparency></IFRAME>

±×¸² 1. Á»ºñ ÇÁ·Î¼¼½º »óÅÂÈ®ÀÎ
À§ÀÇ »óÅÂÈ®ÀÎ °á°ú¸¦ º¸¸é ÀÚ½ÄÇÁ·Î¼¼½º°¡ exit ¸¦ ÇÑÈÄ¿¡ Á»ºñÇÁ·Î¼¼½º·Î ÀüȯµÈ°É È®ÀÎÇÒ ¼ö ÀÖ´Ù. Á»ºñÇÁ·Î¼¼½º´Â PID¸¦ °¡Áö°í ÀÖ±â´Â ÇÏÁö¸¸ CPU, MEMORY µî ¾î¶°ÇÑ ½Ã½ºÅÛ ÀÚ¿øµµ ¼Ò¸ðÇÏÁö ¾Ê°í ÀÖÀ½À» ¾Ë¼ö ÀÖ´Ù. ´Ù¸¸ task ±¸Á¶Ã¼¿¡ ÇÁ·Î¼¼½ºÁ¤º¸¸¸ ³²¾Æ¼­ Ä¿³Î¿¡ ÀÇÇؼ­ °ü¸®µÇ¾î ÀÖÀ» »ÓÀÌ´Ù.
À§¿¡¼­ task ±¸Á¶Ã¼¸¦ º»ÀûÀÌ Àִµ¥, Ä¿³ÎÀº ÀÌÁ߸µÅ©µå ¸®½ºÆ® ÇüÅ·Π°ü¸®ÇÏ´Â ÇÁ·Î¼¼½ºÀÇ µ¥ÀÌŸ¸¦ À¯ÁöÇÏ°Ô µÈ´Ù. ±×·³À¸·Î ºñ·Ï Á»ºñÇÁ·Î¼¼½º°¡ ¾î¶°ÇÑ ÀÚ¿øµµ ¼Ò¸ðÇÏÁö ¾Ê´Â´Ù°í´Â ÇÏÁö¸¸ Ä¿³ÎÀÔÀå¿¡¼­ ºÃÀ»¶§´Â task ÀڷᱸÁ¶¸¦ À¯ÁöÇϱâ À§ÇÑ ¾ó¸¶°£ÀÇ ÀÚ¿øÀ» ¼Ò¸ðÇÏ°í ÀÖÀ½À» ¾Ë¼ö ÀÖ´Ù. ¹«¾ùº¸´Ù Ä¿³ÎÀÌ À¯ÁöÇÒ¼ö ÀÖ´Â task ±¸Á¶Ã¼ÀÇ ¸®½ºÆ®ÀÇ Å©±â¿¡ Á¦ÇÑÀÌ ÀÖÀ½À¸·Î, ¸¹Àº Á»ºñÇÁ·Î¼¼½º°¡ ¹ß»ýÇÒ°æ¿ì ½Ã½ºÅÛ¼º´É¿¡¿µÇâÀ» ¹ÌÄ¥¼ö ÀÖ´Ù. ¶ÇÇÑ ¸®½ºÆ®ÀÇ Å©±â°¡ Å©¸é ¸®½ºÆ®¸¦ ¼øȯÇϴµ¥ °É¸®´Â ½Ã°£(°¢ ÇÁ·Î¼¼½º¸¦ ½ºÄÉÁ층Çϱâ À§ÇÑ)µµ ´õ°É¸®°Ô µÊÀ¸·Î ¿ª½Ã ¼º´É¿¡ ÁÁÁö ¾ÊÀº ¿µÇâÀ» ¹ÌÄ¥¼ö ÀÖÀ»°ÍÀÌ´Ù. °ü¸®ÀÚ°¡ ps ¸í·ÉÀ» ÀÌ¿ëÇؼ­ ½Ã½ºÅÛÀ» ¸ð´ÏÅ͸µ ÇÒ¶§ ±âºÐÀÌ ³ª»µÁö´Â ½É¸®ÀûÈ¿°úµµ ¹«½ÃÇÒ ¼ö ¾ø´Ù(Á¤½ÅÀûÀÎ µ¥¹ÌÁö¸¦ ÀԴ´Ù).
½ÇÁ¦ /proc/[PID] µð·ºÅ丮¿¡°¡¼­ ÇÁ·Î¼¼½º »óŸ¦ È®ÀÎÇغ¸¸é ¸ðµç proc ÆÄÀÏÀÇ Å©±â°¡ 0À¸·Î µÇ¾îÀÖ´Â°É È®ÀÎÇÒ¼ö ÀÖ´Ù. ÇÁ·Î¼¼½º À̹ÌÁö ÀÚü°¡ ³²¾Æ ÀÖ´Â ¾Ê´Ù´Â °ÍÀ» ¾Ë¼ö ÀÖ´Ù. ¶ÇÇÑ ¸ðµç ÆÄÀÏ(Ç¥ÁØÀÔ·Â, Ãâ·Â, ¿¡·¯, ±âŸÆÄÀÏ) ¿ª½Ã ´ÝÇûÀ½À» ¾Ë¼ö ÀÖ´Ù.
±×¸² 2. Á»ºñ ÇÁ·Î¼¼½ºÀÇ proc »óÅÂ

1.3Àý. Á»ºñÇÁ·Î¼¼½º ¾ø¾Ö±â

Á»ºñÇÁ·Î¼¼½º´Â ½Ã½ºÅÛ¿¡ ÁÁÁö ¾ÊÀº¿µÇâÀ» ÁÜ°ú µ¿½Ã¿¡, ½É¸®ÀûÀΠŸ°ÝÀ» ÁÜÀ¸·Î Á»ºñÇÁ·Î¼¼½º´Â »ý±âÁö ¾Êµµ·Ï ÇÏ´Â°Ô Áß¿äÇÏ´Ù. À̹øÀå¿¡¼­´Â Á»ºñÇÁ·Î¼¼½º¸¦ ¾ø¾Ö´Â ¹æ¹ýµé¿¡ ´ëÇؼ­ ¾Ë¾Æº¸µµ·Ï ÇÏ°Ú´Ù.
ÀÛÀº Á¤º¸: º¸Åë ƯÁ¤ ÇÁ·Î¼¼½º¸¦ Á¾·á½ÃÅ°±â À§Çؼ­ ¿ì¸®´Â kill ½Ã½ºÅÛ¸í·É¾î¸¦ ÀÌ¿ëÇؼ­ ÇØ´ç ÇÁ·Î¼¼½ºÀÇ PID·Î ½Ã±×³ÎÀ» º¸³»¸ç, ÇÁ·Î¼¼½º°¡ ½Ã±×³Î¿¡ ¹ÝÀÀÇÏÁö ¾ÊÀ»°æ¿ì -9 (SIGKILL)À» º¸³»¼­ °­Á¦ÀûÀ¸·Î Á¾·áÇÑ´Ù.
±×·¯³ª Á»ºñÇÁ·Î¼¼½ºÀÇ °æ¿ì ÀÌ·¯ÇÑ ½Ã±×³ÎÀ» º¸³½´Ù°í ÇÏ´õ¶óµµ Á¾·áµÇÁö ¾Ê´Â´Ù. ÀÌ°ÍÀº ´ç¿¬ÇÏ´Ù. Á»ºñÇÁ·Î¼¼½º´Â ½ÇÁ¦ Á¸ÀçÇÏÁö ¾Ê´Â ÀÌ¹Ì Á¾·áµÈ ÇÁ·Î¼¼½ºÀÓÀ¸·Î Á¾·áµÈ ÇÁ·Î¼¼½º¿¡ Á¾·á½Ã±×³ÎÀ» º¸³½´Ù°í Çؼ­ ¿©±â¿¡ ¹ÝÀÀÇÏÁö´Â ¾Ê±â ¶§¹®ÀÌ´Ù.
Á»ºñÇÁ·Î¼¼½º°¡ ¹ß»ýÇÏ´Â »óȲÀº 1.2Àý¿¡¼­ ¼³¸íÇßµíÀÌ, ÀÚ½ÄÇÁ·Î¼¼½º°¡ Á¾·áµÇ¾ú´Âµ¥, ¾ÆÁ÷ ºÎ¸ðÇÁ·Î¼¼½º°¡ Á¾·áµÇÁö ¾Ê¾Ò°Å³ª, ºÎ¸ðÇÁ·Î¼¼½º°¡ wait()°è¿­ ÇÔ¼ö¸¦ È£ÃâÇؼ­ ÀÚ½ÄÇÁ·Î¼¼½º¸¦ Á¤¸®ÇÏÁö ¾Ê¾ÒÀ» °æ¿ì ¹ß»ýÇÑ´Ù. Áï fork()¸¦ »ç¿ëÇÏ´Â ÇÁ·Î±×·¡¹Ö¿¡¼­ Á»ºñÇÁ·Î¼¼½º°¡ ¹ß»ýÇÒ È®·üÀÌ ³ô´Ù´Â ¶æÀÌ µÉ°ÍÀÌ´Ù. ÀÌ·¯ÇÑ°æ¿ì Á»ºñÇÁ·Î¼¼½º¸¦ ¸·´Â ÀϹÝÀûÀÎ ¹æ¹ýÀº wait()ÇÔ¼ö¸¦ ºÎ¸ð¿¡¼­ È£ÃâÇÏ´Â °ÍÀÌ´Ù.
´ÙÀ½Àº wait() ÇÔ¼öÀÇ ¼±¾ð³»¿ëÀÌ´Ù.
#include <sys/types.h>
#include <sys/wait.h>

pid_t wait(int *status);
pid_t waitpid(pid_t pid, int *status, int options);
			
wait ÇÔ¼ö´Â ÀÚ½ÄÇÁ·Î¼¼½º°¡ Á¾·áµÉ¶§±îÁö ÇöÀç ÇÁ·Î¼¼½º¸¦ ºí·°Å· ½ÃÅ°¸ç, ÀÚ½ÄÀÌ Á¾·áµÇ°Å³ª ½Ã±×³Î(ÁÖ·Î SIGCHLD)ÀÌ ¹ß»ýÇؼ­ ½Ã±×³ÎÇڵ鷯¸¦ È£ÃâÇÒ¶§ return µÈ´Ù. ¸¸ÀÏ wait ¸¦ È£ÃâÇϱâ Àü¿¡ ÀÚ½ÄÇÁ·Î¼¼½º°¡ ÀÌ¹Ì Á¾·á µÇ¾î¼­ Á»ºñ»óÅ·Π±â´Ù¸®°í ÀÖ´Ù¸é, ÇÔ¼ö´Â Áï½Ã ¸®ÅÏÇÑ´Ù. ¸®ÅÏÇϸ鼭 ÇÔ¼ö´Â ÇÁ·Î¼¼½ºÀÇ »óÅ°ªÀ» ¾ò¾î¿À°í, task ±¸Á¶Ã¼¿¡¼­ ÇØ´ç ÇÁ·Î¼¼½ºÀÇ Á¤º¸¸¦ ¿ÏÀüÈ÷ »èÁ¦ÇÑ´Ù. wait(2) ÇÔ¼ö¿¡ ´ëÇÑ ÀÚ¼¼ÇÑ ³»¿ëÀº man ÆäÀÌÁö¸¦ Âü°íÇϱ⠹ٶõ´Ù.

1.3.1Àý. ºí·°Å· ¸ðµå¿¡¼­ÀÇ ÀÛ¾÷ÀÌ °¡´ÉÇÒ°æ¿ì

ÀÌ°æ¿ì´Â ´ÜÁö wait ¸¦ ÀÌ¿ëÇؼ­ ±â´Ù¸®±â¸¸ ÇϸéµÈ´Ù. À§ÀÇ zombie.c ¿¹Á¦¸¦ wait ¸¦ ÀÌ¿ëÇؼ­ Á»ºñ°¡ ¹ß»ýÇÏÁö ¾Êµµ·Ï Äڵ带 ¼öÁ¤Çغ¸µµ·Ï ÇÏÀÚ.
¿¹Á¦ : zombie_wait.c
#include <unistd.h>
#include <string.h>
#include <stdio.h>
#include <sys/types.h>
#include <sys/wait.h>


int main()
{
    int pid;
    int status;
    int spid;
    pid = fork();

    if (pid == 0)
    {
        sleep(5);
        printf("I will be back %d\n", getpid());
        return 1;
    }

    else if(pid > 0)
    {
        printf("Im parent %d\n", getpid());
        printf("Press any key and wait\n");
        getchar();
        // ÀÚ½ÄÇÁ·Î¼¼½º¸¦ wait ÇÑ´Ù. 
        // ÀÚ½ÄÇÁ·Î¼¼½ºÀÇ Á¾·á»óÅ´ status ¸¦ ÅëÇØ ¹Þ¾Æ¿Â´Ù. 
        spid = wait(&status);
        printf("ÀÚ½ÄÇÁ·Î¼¼½º wait ¼º°ø \n");
        // ÀÚ½ÄÇÁ·Î¼¼½ºÀÇ PID, ¸®ÅÏ°ª, Á¾·á»óÅÂ(Á¤»óÁ¾·áȤÀº ºñÁ¤»óÁ¾·á)¸¦ 
        // ¾ò¾î¿Â´Ù.
        printf("PID         : %d\n", spid);
        printf("Exit Value  : %d\n", WEXITSTATUS(status));
        printf("Exit Stat   : %d\n", WIFEXITED(status));
    }
    else
    {
        perror("fork error :");
    }
}
				
ÄÚµå´Â °£´ÜÇÏ´Ù. wait ¸¦ ÅëÇؼ­ ÀÚ½ÄÇÁ·Î¼¼½º¸¦ ±â´Ù¸®°í, wait ÀÇ »óÅ°ªÀ» ÀÌ¿ëÇؼ­ ÀÚ½ÄÇÁ·Î¼¼½º¸¦ Æò°¡ÇÏ´Â Äڵ尡 Ãß°¡µÇ¾îÀÖ´Ù. WEXITSTATUS()´Â ¸ÞÅ©·Î·Î ÇØ´ç ÇÁ·Î¼¼½ºÀÇ exit °ªÀ» Æò°¡ÇÑ´Ù. WIFEXITED()´Â ÇÁ·Î¼¼½ºÀÇ Á¾·á»óŸ¦ ÆÇ´ÜÇϸç Á¤»óÁ¾·á°¡ µÇ¾ú´Ù¸é 0ÀÌ ¾Æ´Ñ°ªÀ» ¸®ÅÏÇÑ´Ù. ÀÌµé ¸ÞÅ©·ÎÇÔ¼öÀÇ Á»´õ »ó¼¼ÇÑ ³»¿ëÀº wait(2)ÀÇ man page¸¦ ÀÌ¿ëÇϱ⠹ٶõ´Ù.

1.3.2Àý. ºñºí·ÏÅ· ¸ðµå¿¡¼­ÀÇ ÀÛ¾÷

±×·±µ¥ À§ÀÇ Äڵ忡´Â ¸ðµç°æ¿ì¿¡ Àû¿ëÇϱ⿣ ¾à°£ÀÇ ¹®Á¦°¡ ÀÖ´Ù. wait °¡ ±âº»ÀûÀ¸·Î ºí·°¸ðµå·Î ÀÛµ¿ÇÔÀ¸·Î½á, µ¿½Ã¿¡ ¿©·¯°³ÀÇ ÀÚ½ÄÇÁ·Î¼¼½º¸¦ »ý¼ºÇÒ°æ¿ì ¹®Á¦°¡ »ý±ä´Ù´Â Á¡ÀÌ´Ù. À̴ ƯÈ÷ ´ÙÁßÀÇ ¿¬°áÀ» ¹Þ¾ÆµéÀÌ´Â (fork·Î ±¸ÇöµÈ) ³×Æ®¿öÅ© ¼­¹öÀÇ °æ¿ì ¹®Á¦°¡ µÉ¼ö ÀÖ´Ù.
³×Æ®¿öÅ© ¼­¹öÀÇ °æ¿ì accept¸¦ ÅëÇؼ­ Ŭ¶óÀ̾ðÆ® ¿¬°áÀÌ È®ÀεǸé, fork() ÇÑÈÄ ´Ù½Ã ºÎ¸ð´Â accept·Î ³Ñ¾î°¡¾ß Çϴµ¥, wait ¸¦ È£ÃâÇØ ¹ö¸±°æ¿ì °¡ÀåÃÖ±Ù¿¡ ¿¬°áµÈ Ŭ¶óÀ̾ðƮó¸® ÇÁ·Î¼¼½º°¡ Á¾·áÇÏÁö ¾Ê´Â ÇÑÀº accept·Î ³Ñ¾î°¥¼ö ¾øÀ»°ÍÀÌ´Ù. °á±¹ Àǵµ¿Í´Â ´Þ¸® Çѹø¿¡ ÇϳªÀÇ ¿¬°á¸¸À» ó¸®ÇÏ´Â ¼­¹öÇÁ·Î±×·¥ÀÌ µÉ°ÍÀÌ´Ù.
°£´ÜÇÏ°Ô »ý°¢Çؼ­ wait¸¦ Á¦°ÅÇÏ¸é µÇ°ÚÁö¸¸, ±×·¨´Ù°¡´Â ´Ù¼öÀÇ Á»ºñÇÁ·Î¼¼½º°¡ °è¼ÓÀûÀ¸·Î ¹ß»ýÇÏ°Ô µÉ°ÍÀÌ´Ù.
ÀÌ·¯ÇÑ ¹®Á¦´Â ÇÁ·Î¼¼½ºÀÇ Á¾·á°¡ ºñµ¿±âÀûÀÎ »óȲÇÏ¿¡¼­ ÀϾ±â ¶§¹®¿¡ ¹ß»ýÇÑ´Ù. ¾ÈŸ±õ°Ôµµ wait ´Â µ¿±âÀûÀÎ »óȲÇÏ¿¡¼­ ÇÁ·Î¼¼½ºÀÇ Á¾·á¸¦ ±â´Ù¸±¼ö Àֱ⠶§¹®¿¡ wait ¸¸À¸·Î´Â À̹®Á¦¸¦ ÇØ°áÇÒ ¼ö ¾ø´Ù.
±×·³À¸·Î ¿ì¸®´Â ´Ù¸¥ ºñµ¿±âÀûÀÎ »ç°ÇÀ» °¨ÁöÇÒ ¼ö ÀÖ´Â µµ±¸¸¦ »ç¿ëÇØ¾ß ÇÒ°ÍÀÌ´Ù. ´ÙÇàÈ÷µµ À¯´Ð½º´Â ÀÌ·¯ÇÑ ºñµ¿±âÀûÀÎ »ç°ÇÀ» ´Ù·ç±â À§ÇÑ signal µµ±¸¸¦ Á¦°øÇÑ´Ù. ¿ì¸®´Â signal À» ÅëÇؼ­ ÇÁ·Î¼¼½º Á¾·á¶ó´Â ºñµ¿±âÀûÀÎ »ç°ÇÀ» °¨ÁöÇÒ¼ö ÀÖ°í, »ç°ÇÀÌ °¨ÁöµÇ¸é wait ¸¦ ÇÔÀ¸·Î½á, ¼º°øÀûÀ¸·Î Á¾·áµÈ ÇÁ·Î¼¼½º¸¦ Á¤¸®ÇÒ¼ö ÀÖ´Ù.
signalÀ» ÀÌ¿ëÇÑ Á¾·áµÈ ÇÁ·Î¼¼½º¿¡ ´ëÇÑ wait ÀÛ¾÷Àº °£´ÜÇÏ´Ù. ÀÚ½ÄÇÁ·Î¼¼½º´Â Á¾·áµÇ¸é ÀÚ½ÅÀÌ Á¾·áµÇ¾ú´Ù´Â°É ºÎ¸ðÇÁ·Î¼¼½º¿¡°Ô ¾Ë¸®±â À§Çؼ­ SIGCHLD ½Ã±×³ÎÀ» ¹ß»ý½ÃŲ´Ù. ºÎ¸ðÇÁ·Î¼¼½º´Â SIGCHLD ½Ã±×³Î¿¡ ´ëÇÑ Çڵ鷯¸¦ ¼³Ä¡ÇÏ°í SIGCHLD ¹ß»ýÇϸé ÇØ´ç Çڵ鷯¸¦ È£ÃâÇÏ¸é µÈ´Ù. ÀÌ ½Ã±×³Î Çڵ鷯¿¡¼­´Â wait¸¦ È£ÃâÇؼ­ ÇØ´ç (½Ã±×³ÎÀ» ¹ß»ýÇÏ°í Á¾·áÇÑ)ÀÚ½ÄÇÁ·Î¼¼½º¿¡ ´ëÇÑ Á¤¸®¸¦ ÇÏ°Ô µÈ´Ù.
´ÙÀ½Àº signal °ú waitÀÇ Á¶ÇÕÀ¸·Î Á»ºñÇÁ·Î¼¼½º ¹ß»ý¹®Á¦¸¦ ÇØ°áÇÑ ¿¹Á¦ÀÌ´Ù.
¿¹Á¦ : zombie_signal.c
#include <unistd.h>
#include <string.h>
#include <stdio.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <signal.h>

void zombie_handler()
{
    int status;
    int spid;
    spid = wait(&status);
    printf("ÀÚ½ÄÇÁ·Î¼¼½º wait ¼º°ø \n");
    printf("================================\n");
    printf("PID         : %d\n", spid);
    printf("Exit Value  : %d\n", WEXITSTATUS(status));
    printf("Exit Stat   : %d\n", WIFEXITED(status));
}

int main()
{
    int pid;
    int status;
    int spid;
    int i;

    // SIGCHLD¿¡ ´ëÇؼ­ ½Ã±×³ÎÇڵ鷯¸¦ ¼³Ä¡ÇÑ´Ù.  
    signal(SIGCHLD, (void *)zombie_handler);
    for (i = 0; i < 3; i++)
    {
        pid = fork();
        int random_value = (random()%5)+3;
        if (pid == 0)
        {
            // ·£´ýÇÏ°Ô ±â´Ù¸°ÈÄ Á¾·áÇÑ´Ù. 
            // ·£´ý°ªÀ» ¸®ÅÏÇÑ´Ù. 
            printf("I will be back %d %d\n", random_value, getpid());
            sleep(random_value);
            return random_value;
        }
    }
    getchar();
}
				
´ÙÀ½Àº À§ÀÇ ¿¹Á¦¸¦ Å×½ºÆ®ÇÑ °á°úÀÌ´Ù.
±×¸² 3. zombie_signalÀÇ ½ÇÇà°á°ú

2Àý. °á·Ð

ÀÌ»ó °£´ÜÇÏ°Ô Á»ºñÇÁ·Î¼¼½º¿¡ ´ëÇÑ Á»´õ ±íÀº³»¿ë¿¡ ´ëÇؼ­ ¾Ë¾Æº¸¾Ò´Ù. À߸øµÈ ³»¿ëÀ̳ª, Ãß°¡Çϸé ÁÁÀ» ³»¿ëÀº ´ñ±ÛÀ» ³²°ÜÁÖ±æ ¹Ù¶õ´Ù. 

À̸§ Æнº¿öµå
ºñ¹Ð±Û (üũÇÏ¸é ±Û¾´À̸¸ ³»¿ëÀ» È®ÀÎÇÒ ¼ö ÀÖ½À´Ï´Ù.)
¿ÞÂÊÀÇ ±ÛÀÚ¸¦ ÀÔ·ÂÇϼ¼¿ä.
   

 



 
»çÀÌÆ®¸í : ¸ðÁö¸®³× | ´ëÇ¥ : ÀÌ°æÇö | °³ÀÎÄ¿¹Â´ÏƼ : ·©Å°´åÄÄ ¿î¿µÃ¼Á¦(OS) | °æ±âµµ ¼º³²½Ã ºÐ´ç±¸ | ÀüÀÚ¿ìÆí : mojily°ñ¹ðÀÌchonnom.com Copyright ¨Ï www.chonnom.com www.kyunghyun.net www.mojily.net. All rights reserved.