ÇöÀç°Á : UNIX BSD ¼ÒÄÏ ½Ã½ºÅÛ ÄÝ ÀÌÀü: 2.4 ¼¹ö ÇÁ·Î±×·¥ ÀÛ¼ºÀýÂ÷
2.5 ¼ÒÄÏ °ü·Ã UNIX ½Ã½ºÅÛ ÄÝ
¢º º» Àý¿¡¼´Â ¼ÒÄÏ ÇÁ·Î±×·¥ ÀÛ¼º½Ã ¸¹ÀÌ »ç¿ëµÇ´Â UNIX ½Ã½ºÅÛ ÄÝÀ» ¼Ò°³ÇÑ´Ù.
¢º ¸ÕÀú UNIX¿¡¼ ½Ã±×³Î(signal)ÀÌ ¹ß»ýÇßÀ» ¶§ À̸¦ ó¸®ÇÏ´Â ³»¿ëÀ» ÀÓÀÇ·Î ¹Ù²Ü ¶§ »ç¿ëµÇ´Â signal() ½Ã½ºÅÛ ÄÝÀ» ¼³¸íÇÏ°í, ÇÁ·Î¼¼½º¸¦ º¹Á¦ÇÏ´Â µ¥ »ç¿ëµÇ´Â fork() ½Ã½ºÅÛ ÄÝÀ» ¼³¸íÇÑ´Ù.
2.5.1 signal()
¢º UNIX ¿î¿µÃ¼Á¦¿¡¼ ½Ã±×³ÎÀº ½Ã½ºÅÛ³»¿¡¼ ¾î¶² »ç°Ç(event)ÀÌ ¹ß»ýÇÑ °ÍÀ» ÇÁ·Î¼¼½º »çÀÌ¿¡ ¾Ë¸®´Â ¼ö´ÜÀ¸·Î »ç¿ëµÇ´Âµ¥ UNIX¿¡¼´Â 31°³ÀÇ »ç°Ç¿¡ ´ëÇÑ ½Ã±×³ÎÀÌ Á¤ÀǵǾî ÀÖ´Ù.
¢º ¼ÒÄÏ ÇÁ·Î±×·¥¿¡¼ ÁÖ·Î »ç¿ëµÇ´Â ½Ã±×³ÎÀº SIGFPE, SIGIO, SIGURG ¼¼ °¡ÁöÀÌ´Ù(Ç¥ 2-3 ÂüÁ¶).
SIGFPE | ºÎµ¿¼Ò¼öÁ¡ ¿¬»ê ¿¡·¯¸¦ ³ªÅ¸³¿. |
SIGIO | I/O°¡ °¡´ÉÇÑ »óŸ¦ ³ªÅ¸³¿. |
SIGURG |
Out-of-band µ¥ÀÌÅÍ µµÂø°ú °°Àº ±ä±ÞÇÑ(urgent) ¼ÒÄÏ »óŸ¦ ³ªÅ¸³¿. |
Ç¥ 2-3 ¼ÒÄÏ °ü·Ã ½Ã±×³Î Á¾·ù
¢º ½Ã±×³ÎÀÌ ¹ß»ýÇßÀ» ¶§ À̸¦ µðÆúÆ®·Î ó¸®ÇÏ´Â ³»¿ëÀº UNIX Ä¿³Î¿¡ ¹Ì¸® Á¤ÀǵǾî ÀÖ´Ù(¿¹¸¦µé¾î ºÎµ¿¼Ò¼öÁ¡ ¿¡·¯°¡ ¹ß»ýÇϸé ÇÁ·Î±×·¥ÀÌ Á¾·áµÈ´Ù).
¢º ±×·¯³ª ÇÁ·Î±×·¡¸Ó´Â ½Ã±×³ÎÀÌ ¹ß»ýÇÏ¿´À» ¶§ ÀÌ¿Í°°Àº UNIX Ä¿³ÎÀÌ Á¦°øÇÏ´Â µðÆúÆ® 󸮱⠴ë½Å ½Ã±×³Î ó¸® ÇÔ¼ö¸¦ ÀÓÀÇ·Î ÁöÁ¤ÇÒ ¼ö Àִµ¥ ÀÌ ¶§ signal() ½Ã½ºÅÛ ÄÝÀ» »ç¿ëÇØ¾ß ÇÑ´Ù.
¢º ¾Æ·¡ÀÇ ÇÁ·Î±×·¥ Äڵ忡¼ signal(SIGIO, sigio_func)ÀÌ È£ÃâµÈ ÀÌÈÄ¿¡ ½Ã½ºÅÛ¿¡¼ SIGIO ½Ã±×³ÎÀÌ ¹ß»ýÇϸé UNIX Ä¿³ÎÀÇ µðÆúÆ® 󸮱Ⱑ µ¿ÀÛÇÏÁö ¾Ê°í sigio_func() ÇÔ¼ö°¡ ¼öÇàµÈ´Ù.
#include
<signal.h> main() { int sigio_func(); /* »ç¿ëÀÚ Á¤ÀÇ ÇÔ¼ö ¼±¾ð */ signal(SIGIO, sigio_func); /* ½Ã±×³Î ó¸® ÇÔ¼ö ÁöÁ¤ */ : } int sigio_func() { /* SIGIO ½Ã±×³Î ¹ß»ý½Ã ó¸® ºÎºÐ */ } |
¢º ÇÑÆí ÀÀ¿ë ÇÁ·Î±×·¥¿¡¼ ¾ÕÀ¸·Î ¹ß»ýÇÒ ½Ã±×³ÎÀ» ´Ü¼øÈ÷ ¹«½ÃÇÏ·Á¸é ´ÙÀ½°ú °°ÀÌ ¹«½ÃÇÒ ½Ã±×³ÎÀÇ Á¾·ù(¿¹¸¦µé¸é SIGIO)¸¦ ÁöÁ¤ÇÏ°í ¿É¼ÇÀ¸·Î ½Ã±×³Î ¹«½Ã(SIG_IGN)¸¦ ¼±ÅÃÇÏ¿© signal() ½Ã½ºÅÛ ÄÝÀ» È£ÃâÇÏ¸é µÈ´Ù.
signal(SIGIO, SIG_IGN);
¢º ´ÙÀ½¿¡´Â signal()À» »ç¿ëÇÏ´Â ¿¹Á¦ ÇÁ·Î±×·¥À¸·Î 1Ãʸ¶´Ù Ä«¿îÅ͸¦ Áõ°¡½ÃÅ°°í À̸¦ ȸ鿡 Ãâ·ÂÇÏ´Â ÇÁ·Î±×·¥ signal_test.c¸¦ ¼Ò°³ÇÑ´Ù.
¢º UNIX ÇÁ·Î±×·¥ÀÌ ½ÇÇàµÇ´Â µµÁß¿¡ »ç¿ëÀÚ°¡ Ctrl-C¸¦ ÀÔ·ÂÇÏ¸é ½Ã±×³Î SIGINT°¡ ¹ß»ýÇÑ´Ù.
¢º ¿¹Á¦ ÇÁ·Î±×·¥ signal_test.c¿¡¼´Â SIGINT ½Ã±×³ÎÀÌ ¹ß»ýÇϸé ÇÁ·Î±×·¥ÀÌ ¹Ù·Î Á¾·áµÇ´Â °ÍÀÌ ¾Æ´Ï¶ó my_signal ()À̶ó´Â ÇÔ¼ö°¡ È£ÃâµÇ°Ô ÇÏ¿´´Ù.
¢º my_signal()³»¿¡¼ Ctrl-C°¡ ÀÔ·ÂµÈ »ç½ÇÀ» ȸ鿡 Ãâ·ÂÇÏ°í Ctrl-C°¡ ¼¼ ¹ø ÀÔ·ÂµÇ¸é ±× ¶§ ÇÁ·Î±×·¥À» Á¾·áÇϵµ·Ï ÇÏ¿´´Ù.
¢º signal_test.cÀÇ ½ÇÇà ¿¹´Â ´ÙÀ½°ú °°´Ù.
# signal_test 0
1
^C
Ctrl-C pressed.
2
3
^C
Ctrl-C pressed.
4
^C
Ctrl-C pressed.
5
#
¢º signal_test.c¿¡¼´Â ¸ÕÀú ½Ã±×³Î SIGINT°¡ ¹ß»ýÇßÀ» ¶§ »ç¿ëÀÚ Á¤ÀÇÇÔ¼ö my _singal()°¡ ¼öÇàµÇµµ·Ï ´ÙÀ½°ú °°ÀÌ signal() ½Ã½ºÅÛ ÄÝÀ» È£ÃâÇØ µÎ¾î¾ß ÇÑ´Ù.
signal(SIGINT, my_signal);
¢º »õ·Î ÁöÁ¤µÈ ½Ã±×³Î ó¸® ÇÔ¼ö my_signal()¿¡¼´Â SIGINT°¡ ¹ß»ýÇßÀ½À» ȸ鿡 Ãâ·ÂÇÏ°í Cntl-C°¡ ÀÔ·ÂµÈ È½¼ö¸¦ ¼¼±â À§ÇÑ Ä«¿îÅÍ count¸¦ 1 Áõ°¡½ÃŲ´Ù.
int my_signal() {
printf("\nCtrl-C pressed.\n"); count++; return 0; } |
¢º signal_test.c Àüü ÇÁ·Î±×·¥ ¸®½ºÆ®
2.5.2 fork()
¢º UNIX¿¡¼ ÀÓÀÇÀÇ ÇÁ·Î¼¼½º´Â fork()¸¦ ÀÌ¿ëÇؼ ÀڽŰú ¶È°°Àº ±â´ÉÀ» ¼öÇàÇÏ´Â ÇÁ·Î¼¼½º¸¦ Çϳª º¹Á¦ÇÒ ¼ö ÀÖ´Ù.
¢º fork()¸¦ È£ÃâÇÑ ÇÁ·Î¼¼½º¸¦ ºÎ¸ð(parent) ÇÁ·Î¼¼½º¶ó ÇÏ°í »õ·Î »ý±ä ÇÁ·Î¼¼½º¸¦ ÀÚ½Ä(child) ÇÁ·Î¼¼½º¶ó°í ÇÑ´Ù.
¢º ÀÚ½Ä ÇÁ·Î¼¼½º´Â ºÎ¸ð ÇÁ·Î¼¼½ºÀÇ ÄÚµå, ½ºÅÃ, ÆÄÀϱâ¼úÀÚ, ¼ÒÄϹøÈ£ µîÀ» °øÀ¯ÇÏ°Ô µÇ¾î ÇÁ·Î¼¼½º ¼öÇà ȯ°æÀÌ ºÎ¸ð ÇÁ·Î¼¼½º¿Í °°°Ô µÈ´Ù.
¢º ´Ü, »õ·Î »ý±ä ÀÚ½Ä ÇÁ·Î¼¼½ºÀÇ id ¹øÈ£(PID: Process Identication)´Â ºÎ¸ð ÇÁ·Î¼¼½ºÀÇ PID¿Í ±¸º°µÇ¸ç °¢Á¾ º¯¼öµéÀº °øÀ¯ÇÏÁö ¾Ê´Â´Ù.
¢º fork() ½Ã½ºÅÛ ÄÝÀÌ ¼º°øÀûÀ¸·Î ¼öÇàµÇ¸é ±× ¼ø°£¿¡ ÇϳªÀÇ ÇÁ·Î¼¼½º°¡ µÎ °³ÀÇ ÇÁ·Î¼¼½º·Î µÇ´Âµ¥ µÎ ÇÁ·Î¼¼½º´Â ¼öÇàÇÒ ÀÏÀ» ±¸ºÐÇϱâ À§ÇÏ¿© µÎ ÇÁ·Î¼¼½ºÀÇ fork() ¸®ÅϹ®ÀÌ ¼·Î ´Ù¸£´Ù´Â °ÍÀ» ÀÌ¿ëÇÑ´Ù.
¢º ºÎ¸ð ÇÁ·Î¼¼½º¿¡°Ô´Â fork()ÀÇ ¸®ÅÏ°ªÀ¸·Î »õ·Î ¸¸µé¾îÁø ÀÚ½Ä ÇÁ·Î¼¼¼ÀÇ PID°¡ ¸®ÅϵǸç, ÀÚ½Ä ÇÁ·Î¼¼½º¿¡°Ô´Â fork()ÀÇ ¸®ÅÏ°ªÀÌ 0ÀÌ µÈ´Ù.
¢º ÇÑÆí fork() ¹®ÀÌ ½ÇÆÐÇÑ °æ¿ì ºÎ¸ð ÇÁ·Î¼¼½º¿¡¼´Â -1À» ¸®ÅÏÇÏ°í, ÀÚ½Ä ÇÁ·Î¼¼½º´Â »ý¼ºµÇÁö ¾Ê´Â´Ù.
¢º ±×¸² 2-14¿¡ PID°¡ 135ÀÎ ¾î¶² ÇÁ·Î¼¼½º°¡ fork()¸¦ ¼öÇàÇÏ¿© ÀÚ½Ä ÇÁ·Î¼¼½º¸¦ ¸¸µå´Â °ÍÀ» º¸¿´´Ù.
±×¸² 2-14 fork()ÀÇ ¼öÇà°úÁ¤
¢º ¿¹¸¦µé¾î ¾Æ·¡¿Í °°Àº ÇÁ·Î±×·¥ Äڵ带 ¼öÇàÇϸé fork() ¹®À» ¸¸³ª´Â ¼ø°£¿¡ µÎ °³ÀÇ ÇÁ·Î¼¼½º°¡ »ý¼ºµÇ´Âµ¥ ±× Áß ÀÚ½Ä ÇÁ·Î¼¼½º´Â fork()ÀÇ ¸®ÅÏ°ªÀÌ 0ÀÌ µÇ¹Ç·Î child_ work()¸¦ ¼öÇàÇÏ°í, ºÎ¸ð ÇÁ·Î¼¼½º¿¡¼´Â fork()ÀÇ ¸®ÅÏ°ªÀÌ ÀÚ½Ä ÇÁ·Î¼¼½ºÀÇ PID °ª(Áï 0ÀÌ ¾Æ´Ô)ÀÌ µÇ¹Ç·Î parent_work()¸¦ ¼öÇàÇÏ°Ô µÈ´Ù.
int PID; PID = fork(); if(PID == 0) { child_work(); /* ÀÚ½Ä ÇÁ·Î¼¼½º¿ë ÄÚµå */ } else { parent_work(); /* ºÎ¸ð ÇÁ·Î¼¼½º¿ë ÄÚµå */ } |
¢º ´ÙÀ½Àº fork()ÀÇ »ç¿ë ¿¹·Î ºÎ¸ð¿Í ÀÚ½Ä ÇÁ·Î¼¼½º°¡ °°Àº À̸§ÀÇ º¯¼ö¸¦ °¢°¢ Áõ°¡½ÃÅ°°í ±× °á°ú¸¦ È®ÀÎÇØ º¸´Â ¿¹Á¦ ÇÁ·Î±×·¥ fork_test.c¸¦ ¼Ò°³ÇÑ´Ù.
¢º ÀÚ½Ä ÇÁ·Î¼¼½º´Â µÎ °³ÀÇ º¯¼ö global_var°ú local_var¸¦ °¢°¢ 1¾¿ Áõ°¡½ÃÅ°¸ç, ºÎ¸ð ÇÁ·Î¼¼¼´Â 2ÃÊ ÈÄ¿¡ ÀÌ µÎ º¯¼ö¸¦ °¢°¢ 5¾¿ Áõ°¡½ÃŲ´Ù.
/*----------------------------------------------------------------------------------------------
ÆÄÀϸí : fork_test.c ±â ´É : fork() ½Ã½ºÅÛ ÄÝ »ç¿ë ¿¬½À ÄÄÆÄÀÏ : cc -o fork_test fork_test.c ½ÇÇ࿹ : fork_test ----------------------------------------------------------------------------------------------*/ #include <sys/types.h> #include <unistd.h> int global_var = 0; /* Àü¿ª º¯¼ö ¼±¾ð
*/ int main(void) { pid_t pid; int local_var = 0; /* Áö¿ª º¯¼ö ¼±¾ð */ if((pid = fork()) < 0) { printf("fork error\n"); return -1; /* ÀÚ½Ä ÇÁ·Î¼¼½º */ } else if (pid == 0) { global_var++; local_var++; printf("CHILD - my pid : %d, parent's pid : %d\n", getpid(), getppid()); } else { /* ºÎ¸ð ÇÁ·Î¼¼½º */ sleep(2); /* 2ÃÊ ½®´Ù */ global_var += 5; local_var += 5; printf("PARENT - my pid is %d, child's pid is %d\n", getpid(), pid); } printf("\t global var : %d\n", global_var); printf("\t local var : %d\n", local_var); } |
¢º ÀÌ ÇÁ·Î±×·¥ ½ÇÇà °á°ú´Â ´ÙÀ½°ú °°´Ù.
# fork_test CHILD - my pid is 12557 and parent's pid is 12556 global var : 1 local var : 1 PARENT - my pid is 12556 and child's pid is 12557 global var : 5 local var : 5 # |
¢º ÀÌ ÇÁ·Î±×·¥ ½ÇÇà °á°ú¿¡¼ 2ÃÊ ÈÄ¿¡ ºÎ¸ð ÇÁ·Î¼¼½º°¡ main() ÇÔ¼ö ¹Û°ú ¾È¿¡¼ Á¤ÀÇµÈ º¯¼ö global_var¿Í local_var¸¦ °¢°¢ 5¾¿ Áõ°¡½ÃÄ״µ¥ ±× °á°ú°¡ ¸ðµÎ 6ÀÌ µÇÁö ¾Ê°í 5°¡ µÇ¾î ÀÖ´Â °ÍÀ» ÁÖ¸ñÇÒ ÇÊ¿ä°¡ ÀÖ´Ù.
¢º Áï, ÀÚ½Ä ÇÁ·Î¼¼½º¿Í ºÎ¸ð ÇÁ·Î¼¼½º´Â ÆÄÀÏÀ̳ª ¼ÒÄÏÀº °øÀ¯ÇÏÁö¸¸ º¯¼ö´Â °øÀ¯ÇÏÁö ¾Ê´Â´Ù´Â °ÍÀ» ¾Ë ¼ö ÀÖ´Ù.
ÇöÀç°Á : UNIX BSD ¼ÒÄÏ ½Ã½ºÅÛ ÄÝ ÀÌÀü: 2.4 ¼¹ö ÇÁ·Î±×·¥ ÀÛ¼ºÀýÂ÷