°Ô½Ã¹° 1,369°Ç
Zombie ¿¡ ´ëÇÑ °íÂû
±Û¾´ÀÌ :
ÃÖ°í°ü¸®ÀÚ
³¯Â¥ : 2009-12-01 (È) 10:48
Á¶È¸ : 10850
±ÛÁÖ¼Ò :
±³Á¤ °úÁ¤
±³Á¤ 0.8
2003³â 3¿ù 27ÀÏ 23½Ã
ÃÖÃÊ ¹®¼ÀÛ¼º
Á»ºñÇÁ·Î¼¼½ºÀÇ Á¤ÀÇ´Â ½ÇÇàÀÌ Á¾·áµÇ¾úÁö¸¸ ¾ÆÁ÷ »èÁ¦µÇÁö ¾ÊÀº ÇÁ·Î¼¼½º¸¦ ¸»ÇÑ´Ù.
Á¾·áµÇ¾úÁö¸¸ »èÁ¦µÇÁö ¾Ê¾Ò´Ù´Â ¶æ¿¡ ´ëÇؼ ¾Ë¾Æº¸µµµµ·Ï ÇÏÀÚ. º¸Åë ÇÁ·Î¼¼½º´Â 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 ±¸Á¶Ã¼¸¦ ¼ÒºñÇÏ°Ô µÊÀ¸·Î, ¸¹Àº ¼öÀÇ Á»ºñÇÁ·Î¼¼½º´Â ½Ã½ºÅÛ¿¡ ¾Ç¿µÇâÀ» ³¢Ä¥¼ö ÀÖ´Ù.
±×·³ ½ÇÁ¦·Î Á»ºñÇÁ·Î¼¼½º¸¦ ¹ß»ý½ÃÅ°°í ¹ß»ýµÈ Á»ºñÇÁ·Î¼¼½ºÀÇ »óŸ¦ È®ÀÎÇؼ Á»ºñÇÁ·Î¼¼½º°¡ ½Ã½ºÅÛ¿¡ ¾î¶²¿µÇâÀ» ¹ÌÄ¥¼ö ÀÖ´ÂÁö¿¡ ´ëÇؼ ¾Ë¾Æº¸µµ·Ï ÇÏ°Ú´Ù. ±×¸®°í Á»ºñÇÁ·Î¼¼½º°¡ ¾Ç¿µÇâÀ» ¹ÌÄ¥¼ö ÀÖ´Ù°í Çߴµ¥, ±×·¸´Ù¸é Á»ºñ ÇÁ·Î¼¼½º¸¦ ¹æÁöÇÏ´Â ¹æ¹ý¿¡ ´ëÇؼµµ ¾Ë¾Æº¸µµ·Ï ÇÑ´Ù.
Á»ºñÇÁ·Î¼¼½º¸¦ ¹ß»ý½ÃÅ°´Â °¡Àå °£´ÜÇÑ ¹æ¹ýÀº
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ÃÊ ´ÜÀ§·Î È®ÀÎÇϱâ À§ÇÑ °£´ÜÇÑ ½ºÅ©¸³Æ®À̸ç ÀÌ°ÍÀÇ ½ÇÇà°á°úÀÌ´Ù.
À§ÀÇ »óÅÂÈ®ÀÎ °á°ú¸¦ º¸¸é ÀÚ½ÄÇÁ·Î¼¼½º°¡ exit ¸¦ ÇÑÈÄ¿¡ Á»ºñÇÁ·Î¼¼½º·Î ÀüȯµÈ°É È®ÀÎÇÒ ¼ö ÀÖ´Ù. Á»ºñÇÁ·Î¼¼½º´Â PID¸¦ °¡Áö°í ÀÖ±â´Â ÇÏÁö¸¸ CPU, MEMORY µî ¾î¶°ÇÑ ½Ã½ºÅÛ ÀÚ¿øµµ ¼Ò¸ðÇÏÁö ¾Ê°í ÀÖÀ½À» ¾Ë¼ö ÀÖ´Ù. ´Ù¸¸ task ±¸Á¶Ã¼¿¡ ÇÁ·Î¼¼½ºÁ¤º¸¸¸ ³²¾Æ¼ Ä¿³Î¿¡ ÀÇÇؼ °ü¸®µÇ¾î ÀÖÀ» »ÓÀÌ´Ù.
À§¿¡¼ task ±¸Á¶Ã¼¸¦ º»ÀûÀÌ Àִµ¥, Ä¿³ÎÀº ÀÌÁ߸µÅ©µå ¸®½ºÆ® ÇüÅ·Π°ü¸®ÇÏ´Â ÇÁ·Î¼¼½ºÀÇ µ¥ÀÌŸ¸¦ À¯ÁöÇÏ°Ô µÈ´Ù. ±×·³À¸·Î ºñ·Ï Á»ºñÇÁ·Î¼¼½º°¡ ¾î¶°ÇÑ ÀÚ¿øµµ ¼Ò¸ðÇÏÁö ¾Ê´Â´Ù°í´Â ÇÏÁö¸¸ Ä¿³ÎÀÔÀå¿¡¼ ºÃÀ»¶§´Â task ÀڷᱸÁ¶¸¦ À¯ÁöÇϱâ À§ÇÑ ¾ó¸¶°£ÀÇ ÀÚ¿øÀ» ¼Ò¸ðÇÏ°í ÀÖÀ½À» ¾Ë¼ö ÀÖ´Ù. ¹«¾ùº¸´Ù Ä¿³ÎÀÌ À¯ÁöÇÒ¼ö ÀÖ´Â task ±¸Á¶Ã¼ÀÇ ¸®½ºÆ®ÀÇ Å©±â¿¡ Á¦ÇÑÀÌ ÀÖÀ½À¸·Î, ¸¹Àº Á»ºñÇÁ·Î¼¼½º°¡ ¹ß»ýÇÒ°æ¿ì ½Ã½ºÅÛ¼º´É¿¡¿µÇâÀ» ¹ÌÄ¥¼ö ÀÖ´Ù. ¶ÇÇÑ ¸®½ºÆ®ÀÇ Å©±â°¡ Å©¸é ¸®½ºÆ®¸¦ ¼øȯÇϴµ¥ °É¸®´Â ½Ã°£(°¢ ÇÁ·Î¼¼½º¸¦ ½ºÄÉÁ층Çϱâ À§ÇÑ)µµ ´õ°É¸®°Ô µÊÀ¸·Î ¿ª½Ã ¼º´É¿¡ ÁÁÁö ¾ÊÀº ¿µÇâÀ» ¹ÌÄ¥¼ö ÀÖÀ»°ÍÀÌ´Ù. °ü¸®ÀÚ°¡ ps ¸í·ÉÀ» ÀÌ¿ëÇؼ ½Ã½ºÅÛÀ» ¸ð´ÏÅ͸µ ÇÒ¶§ ±âºÐÀÌ ³ª»µÁö´Â ½É¸®ÀûÈ¿°úµµ ¹«½ÃÇÒ ¼ö ¾ø´Ù(Á¤½ÅÀûÀÎ µ¥¹ÌÁö¸¦ ÀԴ´Ù).
½ÇÁ¦ /proc/[PID] µð·ºÅ丮¿¡°¡¼ ÇÁ·Î¼¼½º »óŸ¦ È®ÀÎÇغ¸¸é ¸ðµç proc ÆÄÀÏÀÇ Å©±â°¡ 0À¸·Î µÇ¾îÀÖ´Â°É È®ÀÎÇÒ¼ö ÀÖ´Ù. ÇÁ·Î¼¼½º À̹ÌÁö ÀÚü°¡ ³²¾Æ ÀÖ´Â ¾Ê´Ù´Â °ÍÀ» ¾Ë¼ö ÀÖ´Ù. ¶ÇÇÑ ¸ðµç ÆÄÀÏ(Ç¥ÁØÀÔ·Â, Ãâ·Â, ¿¡·¯, ±âŸÆÄÀÏ) ¿ª½Ã ´ÝÇûÀ½À» ¾Ë¼ö ÀÖ´Ù.
Á»ºñÇÁ·Î¼¼½º´Â ½Ã½ºÅÛ¿¡ ÁÁÁö ¾ÊÀº¿µÇâÀ» ÁÜ°ú µ¿½Ã¿¡, ½É¸®ÀûÀΠŸ°ÝÀ» ÁÜÀ¸·Î Á»ºñÇÁ·Î¼¼½º´Â »ý±âÁö ¾Êµµ·Ï ÇÏ´Â°Ô Áß¿äÇÏ´Ù. À̹øÀå¿¡¼´Â Á»ºñÇÁ·Î¼¼½º¸¦ ¾ø¾Ö´Â ¹æ¹ýµé¿¡ ´ëÇؼ ¾Ë¾Æº¸µµ·Ï ÇÏ°Ú´Ù.
ÀÛÀº Á¤º¸: º¸Åë ƯÁ¤ ÇÁ·Î¼¼½º¸¦ Á¾·á½ÃÅ°±â À§Çؼ ¿ì¸®´Â 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 ÆäÀÌÁö¸¦ Âü°íÇϱ⠹ٶõ´Ù.
ÀÌ°æ¿ì´Â ´ÜÁö 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¸¦ ÀÌ¿ëÇϱ⠹ٶõ´Ù.
±×·±µ¥ À§ÀÇ Äڵ忡´Â ¸ðµç°æ¿ì¿¡ Àû¿ëÇϱ⿣ ¾à°£ÀÇ ¹®Á¦°¡ ÀÖ´Ù. 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 ();
}
´ÙÀ½Àº À§ÀÇ ¿¹Á¦¸¦ Å×½ºÆ®ÇÑ °á°úÀÌ´Ù.
ÀÌ»ó °£´ÜÇÏ°Ô Á»ºñÇÁ·Î¼¼½º¿¡ ´ëÇÑ Á»´õ ±íÀº³»¿ë¿¡ ´ëÇؼ ¾Ë¾Æº¸¾Ò´Ù. À߸øµÈ ³»¿ëÀ̳ª, Ãß°¡Çϸé ÁÁÀ» ³»¿ëÀº ´ñ±ÛÀ» ³²°ÜÁÖ±æ ¹Ù¶õ´Ù.