ÇöÀç°­Á : 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 ¼­¹ö ÇÁ·Î±×·¥ ÀÛ¼ºÀýÂ÷