|
Facebook Joinc ±×·ì
Joinc QA »çÀÌÆ®
joinc´Â Firefox¿Í chrome¿¡¼ Å×½ºÆ® Çß½À´Ï´Ù. IE¿¡¼´Â Å×À̺íÀÌ ±úÁö°Å³ª À̹ÌÁö°¡ º¸ÀÌÁö ¾ÊÀ» ¼ö ÀÖ½À´Ï´Ù. ƯÈ÷ ±¸±Û DocsÀ̹ÌÁöÀÇ °æ¿ì ¿¢¹Úó¸®µÉ ¼ö ÀÖ½À´Ï´Ù.
Docbook ¿ø¹®
¾²·¹µå¿Í ½Ã±×³Î¾²·¹µå¿Í ½Ã±×³Î| 고친 과정 |
|---|
| 고침 0.9 | 2004³â 1¿ù 29ÀÏ 23½Ã | | | ½Ã±×³ÎÀ» ÀÌ¿ëÇÑ ¾²·¹µå ÀÛµ¿/ÁßÁö Á¦¾î | | 고침 0.8 | 2003³â 10¿ù 7ÀÏ 23½Ã | | | ÃÖÃÊ ¹®¼ÀÛ¼º |
1. ¾²·¹µå¿¡¼ÀÇ ½Ã±×³Î »ç¿ë ¾²·¹µå¿¡¼ÀÇ ½Ã±×³Î »ç¿ëÀº ½Ã±×³Î¿¡ ´ëÇÑ ±âº»ÀûÀÎ ÀÌÇØ¸¸ °¡Áö°í ÀÖ´Ù¸é
¾à°£ÀÇ ÀÀ¿ëÀ¸·Î ÃæºÐÈ÷ ÇØ°áÇÒ ¼ö ÀÖ´Â ¹®Á¦À̱ä ÇÏÁö¸¸
¹ü À¯´Ð½ºÀûÀ¸·Î ÀÀ¿ëÇϰíÀÚ ÇÑ´Ù¸é(ƯÈ÷ ¸®´ª½º°¡ Æ÷ÇԵȴٸé) ¿î¿µÃ¼Á¦°£
½Å°æ½áÁà¾ßÇÒ ¹®Á¦°¡ ÀÖ´Ù. À̹øÀå¿¡¼´Â ¾²·¹µå¿¡¼ÀÇ ½Ã±×³ÎÀ» ÀÌ¿ëÇÏ´Â ¹æ¹ý°ú
¿î¿µÃ¼Á¦°¡ ´Ù¸§À¸·Î ÀÎÇØ ¹ß»ýÇÒ ¼ö ÀÖ´Â ¹®Á¦µé¿¡ ´ëÇØ¼
¾Ë¾Æº¸µµ·Ï ÇϰڴÙ.
1.1. ½Ã±×³ÎÀ» ƯÁ¤ ¾²·¹µå·Î º¸³»±â ¾²·¹µå¿¡¼ ½Ã±×³ÎÀº ¼·Î °øÀ¯µÈ´Ù´Â°É ¾Ë°í ÀÖÀ» °ÍÀÌ´Ù. ¹®Á¦´Â °øÀ¯µÈ´Ù´Â Á¡Àε¥
¸¸¾à ÇÁ·Î¼¼½º¿¡ ½Ã±×³ÎÀ» º¸³¾ °æ¿ì ÇØ´ç ÇÁ·Î¼¼½º¿¡¼ »ý¼ºµÈ ¸ðµç ¾²·¹µå¿¡ ½Ã±×³ÎÀÌ
Àü´ÞÀÌ µÇ°Ô µÈ´Ù. À̰ÍÀº ¿ì¸®°¡ ¿øÇÏ´Â°Ô ¾Æ´Ï´Ù.
¿ì¸®°¡ ¿øÇÏ´Â °ÍÀº ƯÁ¤ ¾²·¹µå¿¡¼¸¸ ½Ã±×³ÎÀ» ¹Þµµ·Ï ÇÏ´Â °ÍÀÌ´Ù.
ÀÌ·¯ÇÑ ÀÛ¾÷À» À§Çؼ ¿ì¸®´Â ½Ã±×³Î ¸¶½ºÅ©¸¦ »ç¿ëÇÑ´Ù. ½Ã±×³Î ¸¶½ºÅ©´Â
¸»±×´ë·Î ƯÁ¤ ½Ã±×³Î¿¡ ´ëÇØ¼ ¸¶½ºÅ©¸¦ ¾º¿ì´Â °ÍÀ¸·Î ÇØ´ç ¾²·¹µå¿¡¼
ƯÁ¤ ½Ã±×³Î¿¡ ´ëÇØ¼ ¸¶½ºÅ©¸¦ ¾º¿ì¸é ¸¶½ºÅ·µÈ ½Ã±×³ÎÀº ÇØ´ç ¾²·¹µå·Î
Àü´ÞµÇÁö ¾Ê´Â´Ù.
ÀÌ ½Ã±×³ÎÀ» ¹Þ±â¸¦ ¿øÇÏ´Â ¾²·¹µå¿¡¼´Â ÀÌ ½Ã±×³Î¿¡ ´ëÇÑ ¸¶½ºÅ©¸¦ Á¦°Å½ÃŲ´Ù.
±×·¯¸é ºí·°µÇ¾î ÀÖ´Â ½Ã±×³ÎÀº ¸¶½ºÅ©°¡ Á¦°ÅµÈ ¾²·¹µå·Î Àü´ÞµÉ °ÍÀÌ´Ù.
ÀÏÁ¾ÀÇ ÇÊÅͱâ´Ù.
À§ÀÇ ±×¸²Àº ½Ã±×³Î ¸¶½ºÅ©ÀÇ ÀÛµ¿¿ø¸®¸¦ º¸¿©ÁØ´Ù.
¸ÞÀÎ ¾²·¹µå¿¡¼´Â SIGINT¿Í SIGUSR2¿¡ ´ëÇØ¼ ½Ã±×³Î ¸¶½ºÅ©¸¦ ¼³Ä¡ÇÑ´Ù.
±×¸®°í ¾²·¹µå 1¿¡¼´Â SIGINT¿¡ ´ëÇÑ ¸¶½ºÅ©¸¦ Á¦°ÅÇϰí, ¾²·¹µå 2¿¡¼´Â
SIGUSR2¿¡ ´ëÇÑ ¸¶½ºÅ©¸¦ Á¦°ÅÇÑ´Ù. ÀÌ·¸°Ô µÇ¸é SIGINT°¡ ¸ÞÀÎ ¾²·¹µå¿¡
µµÂøÇßÀ» ¶§ ¸¶½ºÅ© ¶§¹®¿¡ ¸ÞÀÎ ¾²·¹µå¿¡´Â µµÂøÇÏÁö ¸øÇÏ°í ¾²·¹µå 1·Î
Àü´ÞµÉ °ÍÀÌ´Ù. SIGUSR2°¡ µµÂøÇßÀ» °æ¿ì ¸ÞÀÎ ¾²·¹µå¿Í ¾²·¹µå 1¿¡¼´Â
¸¶½ºÅ© ¶§¹®¿¡ Àü´ÞµÇÁö ¸øÇÏ°í ¾²·¹µå 2·Î ½Ã±×³ÎÀÌ Àü´ÞµÈ´Ù.
1.1.1절¿¡¼´Â À§ÀÇ ÀÛµ¿¿ø¸® ´ë·Î ±¸ÇöµÈ ¿¹Á¦ Äڵ带 ´Ù·ç°í ÀÖ´Ù.
ÀÌ·¯ÇÑ ¾²·¹µåº° ½Ã±×³Î ¸¶½ºÅ·À» À§Çؼ pthread´Â pthread_sigmask(3)¶ó´Â
ÇÔ¼ö¸¦ Á¦°øÇÑ´Ù.
#include <pthread.h>
#include <signal.h>
int pthread_sigmask(int how, const sigset_t *newmask, sigset_t *oldmask);
|
ÀÌ ÇÔ¼ö´Â ÇöÀç ¾²·¹µå¿¡ ½Ã±×³Î newmask¿Í how
¸¦ ÀÌ¿ëÇØ¼ ½Ã±×³Î ¸¶½ºÅ©¸¦ ¸¸µç´Ù. how´Â SIG_BLOCK, SIG_UNBLOCK, SIG_SETMASKÁß
Çϳª¸¦ ¼±ÅÃÇÒ ¼ö ÀÖ´Ù. SIG_BLOCK´Â ÇöÀç ¼³Á¤µÈ ½Ã±×³Î ¸¶½ºÅ©¿¡
newmask¸¦ Ãß°¡Çϸç SIG_UNBLOCK´Â ÇöÀç ¼³Á¤µÈ ½Ã±×³Î ¸¶½ºÅ©¿¡¼
newmask¸¦ Á¦°ÅÇϰí SIG_SETMASK´Â newmask·Î
ÇöÀç ½Ã±×³Î ¸¶½ºÅ©¸¦ ¼³Á¤ÇÑ´Ù.
1.1.1. °£´Ü ¿¹Á¦ ±×·³ pthread_mask(3)¸¦ ÀÌ¿ëÇÑ °£´ÙÇÑ ¿¹Á¦¸¦ ¸¸µé¾î º¸µµ·Ï ÇϰڴÙ.
ÄÚµå´Â ¿©·¯ºÐÀÌ ½Ã±×³Î°ú ¾²·¹µå¿¡ °üÇÑ ÃÖ¼ÒÇÑÀÇ Áö½ÄÀ» °¡Áö°í ÀÖ´Ù´Â
°¡Á¤ÇÏ¿¡ ÀÛ¼ºµÉ °ÍÀ̸ç, ¼³¸íÀº ÁÖ¼®À¸·Î ´ë½ÅÇϵµ·Ï ÇϰڴÙ.
¿¹Á¦ : th_signal.c
#include <pthread.h>
#include <sys/wait.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <stdio.h>
#include <signal.h>
/*
* ½Ã±×³Î Çڵ鷯
* Çڵ鷯°¡ È£ÃâµÈ ¾²·¹µåÀÇ ID¿Í ½Ã±×³Î ¹øÈ£¸¦ Ãâ·ÂÇÑ´Ù.
*/
void sig_handler(int signo)
{
printf("SIGNAL thid %d : %d\n", pthread_self(),signo);
}
void *threadfunc2(void *arg);
void *threadfunc(void *arg);
int main()
{
int n, i, j;
pthread_t threadid;
// SIGINT¿Í SIGUSR2 ½Ã±×³ÎÀ»
// ½Ã±×³Î ¸¶½ºÅ©¿¡ µî·ÏÇÑ´Ù.
// ½Ã±×³Î ¸¶½ºÅ©´Â ¸ðµç ¾²·¹µå¿¡¼ °øÀ¯µÈ´Ù.
// °í·Î ´Ù¸¥ ¾²·¹µå¿¡¼µµ
// SIGINT, SIGUSR2½Ã±×³Î¿¡ ´ëÇØ¼ ¸¶½ºÅ© µÈ´Ù.
sigset_t newmask;
sigemptyset(&newmask);
sigaddset(&newmask, SIGINT);
sigaddset(&newmask, SIGUSR2);
pthread_sigmask(SIG_BLOCK, &newmask, NULL);
// ¿øÇÏ´Â ¾²·¹µå·Î ½Ã±×³ÎÀÌ Àü´ÞÇÏ´ÂÁö È®ÀÎÇϱâ À§Çؼ
// ¾²·¹µå ID¸¦ È®ÀÎÇÑ´Ù.
if ((n = pthread_create(&threadid, NULL, threadfunc2, NULL)) != 0 )
{
perror("Thread create error ");
exit(0);
}
printf("thread2 id %d\n", threadid);
if ((n = pthread_create(&threadid, NULL, threadfunc, NULL)) != 0 )
{
perror("Thread create error ");
exit(0);
}
printf("thread id %d\n", threadid);
pthread_join(threadid, NULL);
}
void *threadfunc(void *arg)
{
int i=0, j;
struct sigaction act;
sigset_t newmask;
// °á°úÀÇ È®ÀÎÀ» À§Çؼ ¾²·¹µå ID¸¦ Ãâ·ÂÇÑ´Ù.
printf("SIGINT Thread Start %d\n", pthread_self());
// SIGINT¿¡ ´ëÇÑ ½Ã±×³Î Çڵ鷯¸¦ ¼³Ä¡Çϰí
// ½Ã±×³Î ¸¶½ºÅ©¿¡¼ SIGINT¸¦ Á¦°ÅÇÑ´Ù.
sigemptyset(&newmask);
sigaddset(&newmask, SIGINT);
act.sa_handler = sig_handler;
sigaction(SIGINT, &act, NULL);
pthread_sigmask(SIG_UNBLOCK, &newmask, NULL);
while(1)
{
printf("%d\n", i);
i++;
sleep(1);
}
return ;
}
void *threadfunc2(void *arg)
{
struct sigaction act;
// SIGUSR2¿¡ ´ëÇÑ ½Ã±×³Î Çڵ鷯¸¦ ¼³Ä¡Çϰí
// ½Ã±×³Î ¸¶½ºÅ©¿¡¼ SIGUSR2¸¦ Á¦°ÅÇÑ´Ù.
sigset_t newmask;
sigemptyset(&newmask);
sigaddset(&newmask, SIGUSR2);
act.sa_handler = sig_handler;
sigaction(SIGUSR2, &act, NULL);
pthread_sigmask(SIG_UNBLOCK, &newmask, NULL);
while(1)
{
sleep(1);
}
}
|
À§ ÇÁ·Î±×·¥À» ½ÇÇà½ÃŲµÚ kill¸í·ÉÀ¸·Î SIGINT¿Í SIGUSR2 ½Ã±×³ÎÀ» PID·Î º¸³»º¸¸é
ÇØ´ç ¾²·¹µå·Î ½Ã±×³ÎÀÌ Àü´ÞµÇ°í ½Ã±×³Î Çڵ鷯°¡ ½ÇÇàµÇ´Â°É È®ÀÎÇÒ ¼ö ÀÖÀ»
°ÍÀÌ´Ù.
1.2. ¾²·¹µå°£ ½Ã±×³Î Àü¼Û ¿ÜºÎÀÇ ´Ù¸¥ ÇÁ·Î¼¼½º¿¡¼ ½Ã±×³ÎÀ» ¹ß»ý½ÃŰ´Â °Í ¿Ü¿¡µµ °°Àº ÇÁ·Î¼¼½º¿¡¼ ÀÛµ¿ÇÏ´Â
¾²·¹µå°£¿¡ ½Ã±×³ÎÀ» Àü¼ÛÇØ¾ß ÇÏ´Â °æ¿ìµµ »ý±æ °ÍÀÌ´Ù.
ÀÌ·¯ÇÑ ¾²·¹µå°£ ½Ã±×³Î Àü¼ÛÀº ¿©·¯°¡Áö ¸ñÀûÀ¸·Î »ç¿ëÇÒ ¼ö ÀÖ´Ù. ÀÏÁ¤½Ã°£¸¶´Ù
ƯÁ¤ ¾²·¹µå¿¡ ½Ã±×³ÎÀ» Àü¼ÛÇÏ¹Ç·Î½á ¾²·¹µå¸¦ ±ú¿ö¼ Äڵ带 ½ÇÇà½ÃŰ°Ô ÇѴٰųª
³×Æ®¿öÅ© ¾ÖÇø®ÄÉÀ̼ǿ¡¼ write, read¿¡ ŸÀӾƿôÀ» °Ë»çÇÏ´Â ¿ëµµ·Îµµ »ç¿ë°¡´É ÇÏ´Ù.
³×Æ®¿öÅ© ¾ÖÇø®ÄÉÀ̼ǿ¡¼ ½º·¹µå°£ ½Ã±×³Î Àü´ÞÀ» ÅëÇØ ŸÀӾƿôÀ» °Ë»çÇÑ´Ù´Â
»ý°¢Àº Á» »ý¼ÒÇÒ ¼öµµ ÀÖÀ»°Í °°´Ù. º¸ÅëÀº select³ª alarmÀ» »ç¿ëÇÒ °Çµ¥,
¸ÖƼ ¾²·¹µå ÇÁ·Î±×·¥ÀÇ °æ¿ì alarm(2)ÀÇ »ç¿ëÀº »ç½Ç»ó ¾î·Æ´Ù°í º¼ ¼ö ÀÖ´Ù.
¿©·¯°³ÀÇ ¾²·¹µå¿¡¼ alarm(2)À» »ç¿ëÇÒ °æ¿ì ´ÜÁö ÇϳªÀÇ alarm(¸¶Áö¸· alarm°ª)¸¸ÀÌ
µî·ÏµÇ¾î¼ »ç¿ëÇÒ ¼ö Àֱ⠶§¹®ÀÌ´Ù. ±×·¸´Ù¸é select¸¦ »ç¿ëÇØ¾ß ÇÒ °Çµ¥,
select´ë½Å¿¡ Àü¿ëÀÇ ½Ã±×³ÎÀ» ¹ß»ýÇÏ´Â ¾²·¹µå¸¦ ÀÌ¿ëÇØ¼ »ç¿ëÇÒ ¼ö ÀÖ´Ù.
read(2)¸¦ ¿¹·Î µé¾î¼ ¼³¸íÇØ º¸ÀÚ read(2)¸¦ ÇϱâÀü¿¡ ƯÁ¤ (Àü¿ª)°ªÀ» 0À¸·Î ¼¼ÆÃÇϰí
read¸¦ ¼öÇàÇÑÈÄ 1·Î °ªÀ» º¯°æÇϵµ·Ï ÇÑ´Ù. ±×¸®°í ŸÀӾƿô üũ¸¦ À§ÇÑ ¾²·¹µå¿¡¼´Â
ŸÀӾƿô ½Ã°£ °£°ÝÀ¸·Î(sleep(2)¸¦ ÀÌ¿ëÇÏ¸é µÈ´Ù) ÀÌ °ªÀ» °Ë»çÇÑ´Ù.
¸¸¾à °ªÀÌ 0À¸·Î ¼¼ÆÃµÇ¾î ÀÖ´Â°É È®ÀÎ Çߴµ¥, ´ÙÀ½ ½Ã°£ÀÌ µ¹¾Æ¿Â µÚ¿¡µµ ÀÌ °ªÀÌ 0À̶ó¸é
read¿µ¿ª¿¡¼ ŸÀӾƿôÀÌ ¹ß»ýÇß´Ù°í ÆÇ´Ü ÇÒ ¼ö ÀÖÀ» °ÍÀÌ´Ù. ±×·¯¸é ŸÀӾƿôÀÌ
¹ß»ýÇÑ ¾²·¹µå¿¡ ½Ã±×³ÎÀ» Àü¼ÛÇϵµ·Ï ÇÑ´Ù. ¾²·¹µå¿¡ ½Ã±×³ÎÀÌ Àü¼ÛÇϸé ÀÎÅÍ·´Æ®°¡ ¹ß»ýÇϰí
read¿¡¼ ºüÁ®³ª¿À°Ô µÈ´Ù.
if (read(..) < 0)
{
// ¸¸¾à ÀÎÅÍ·´Æ®·Î ÀÎÇÏ¿© ºüÁ®³ª¿Â °Å¶ó¸é..
if (errno == EINTR)
{
...
}
}
|
½Ã±×³Î ¹ß»ý½Ã ÀÎÅÍ·´Æ®°¡ Àü´ÞµÇ°Ô ÇÏ·Á¸é ¾à°£ÀÇ ºÎ°¡ÀûÀÎ ÀÛ¾÷ÀÌ ÇÊ¿äÇѵ¥,
À̰ÍÀº ¼ÒÄÏ Å¸ÀӾƿôÀ» Âü°íÇϱ⠹ٶõ´Ù.
1.2.1. ´Ù¸¥ ¾²·¹µå·Î ½Ã±×³Î Àü¼Û ÀÌ·¯ÇÑ ¾²·¹µå°£ ½Ã±×³Î Àü¼ÛÀ» À§Çؼ pthread_kill(3)À̶ó´Â ÇÔ¼ö°¡ Á¦°øµÈ´Ù.
#include <pthread.h>
#include <signal.h>
int pthread_kill(pthread_t thread, int signo);
|
ù¹øÂ° ÀÎÀÚ thread´Â ½Ã±×³ÎÀ» Àü´Þ¹ÞÀ» ¾²·¹µåÀÇ ½Äº°ÀÚÀ̰í
signo´Â Àü´ÞÇϰíÀÚ ÇÏ´Â ½Ã±×³Î ¹øÈ£ÀÌ´Ù.
º¸³»´Â ÂÊÀº pthread_kill(3)À» ÀÌ¿ëÇØ¼ ºñ±³Àû °£´ÜÇÏ°Ô ±¸ÇöÀÌ °¡´ÉÇÏ´Ù.
1.2.2. ½Ã±×³Î ¹Þ±â ½Ã±×³ÎÀ» ¹Þ´Â ¾²·¹µåÀÇ °æ¿ì µ¿±â¿Í ºñµ¿±â µÎ°¡Áö ¹æ½ÄÀ» ÅëÇØ¼ ¹ÞÀ» ¼ö ÀÖ´Ù.
µ¿±â ¹æ½ÄÀ¸·Î ¹ÞÀ» °æ¿ì´Â sigwait(3)ÇÔ¼ö¸¦ ÀÌ¿ëÇØ¼ ½Ã±×³ÎÀÌ Àü´ÞµÉ ¶§±îÁö
ºí·°µÇ¸é¼ ±â´Ù¸°´Ù.
#include <pthread.h>
#include <signal.h>
int sigwait(const sigset_t *set, int *sig);
|
ÀÌ ÇÔ¼ö´Â ½Ã±×³Î ¼Â set¿¡ ¼³Á¤µÈ ½Ã±×³ÎÁß Çϳª°¡ Àü´ÞµÉ ¶§±îÁö
È£ÃâµÈ ¿µ¿ª¿¡¼ ´ë±âÇÑ´Ù. ½Ã±×³ÎÀ» ¹Þ¾Ò´Ù¸é ¸®Åϵǰí Àü´Þ ¹ÞÀº ½Ã±×³Î ¹øÈ£´Â
sig¸¦ ÅëÇØ¼ ³Ñ¾î¿Â´Ù. ½Ã±×³ÎÀ» ±â´Ù¸°´Ù´Â Ư¡À» ÀÌ¿ëÇØ¼
¾²·¹µå°£ µ¿±âȸ¦ À§ÇÑ ¸ñÀûÀ¸·Îµµ À¯¿ëÇÏ°Ô »ç¿ëÇÒ ¼ö ÀÖÀ» °ÍÀÌ´Ù.
µÎ¹øÂ°´Â ºñµ¿±âÀûÀÎ ¹æ½ÄÀ¸·Î ÄÚµå ½ÇÇàÁß¿¡ ½Ã±×³ÎÀÌ Àü´ÞµÇ¸é ÀÎÅÍ·´Æ®°¡ °É¸®°í
½Ã±×³Î Çڵ鷯°¡ ¼öÇàµÇ´Â ¹æ½ÄÀÌ´Ù.
ÀϹÝÀûÀÎ ½Ã±×³Î »ç¿ë¹æ½Ä°ú µ¿ÀÏÇÏ´Ù.
1.2.3. ¿¹Á¦ sigwait(3)¸¦ ÅëÇØ¼ µ¿±âÀûÀ¸·Î ±â´Ù¸®´Â °ÍÀº ±¸ÇöÀÌ °£´ÜÇϹǷΠµû·Î ´Ù·çÁö ¾Ê°í
½Ã±×³Î Çڵ鷯¸¦ µî·ÏÇØ¼ ºñµ¿±âÀûÀ¸·Î ½Ã±×³ÎÀ» ±â´Ù¸®´Â Äڵ带 ±¸ÇöÇØ º¸µµ·Ï ÇϰڴÙ.
1.1.1절ÀÇ Äڵ带 ¾à°£ ¼öÁ¤Çß´Ù.
¿¹Á¦ : thtoth_sig.c
#include <pthread.h>
#include <sys/wait.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <stdio.h>
#include <signal.h>
/*
* ½Ã±×³Î Çڵ鷯
* Çڵ鷯°¡ È£ÃâµÈ ¾²·¹µåÀÇ ID¿Í ½Ã±×³Î ¹øÈ£¸¦ Ãâ·ÂÇÑ´Ù.
*/
void sig_handler(int signo)
{
printf("SIGNAL RECV TH ID %d : %d\n", pthread_self(),signo);
}
void *threadfunc2(void *arg);
void *threadfunc(void *arg);
void *s_signal(void *arg);
// ¾²·¹µå ID¸¦ ÀúÀåÇÑ´Ù.
int sigid[2];
int main()
{
int n, i, j;
pthread_t threadid;
// ¿øÇÏ´Â ¾²·¹µå·Î ½Ã±×³ÎÀÌ Àü´ÞÇÏ´ÂÁö È®ÀÎÇϱâ À§Çؼ
// ¾²·¹µå ID¸¦ È®ÀÎÇÑ´Ù.
if ((n = pthread_create(&threadid, NULL, threadfunc2, NULL)) != 0 )
{
perror("Thread create error ");
exit(0);
}
sigid[0] = threadid;
printf("thread2 id %d\n", threadid);
if ((n = pthread_create(&threadid, NULL, threadfunc, NULL)) != 0 )
{
perror("Thread create error ");
exit(0);
}
sigid[1] = threadid;
printf("thread id %d\n", threadid);
if ((n = pthread_create(&threadid, NULL, s_signal, NULL)) != 0 )
{
perror("Thread create error ");
exit(0);
}
pthread_join(threadid, NULL);
}
void *threadfunc(void *arg)
{
int i=0, j;
struct sigaction act;
sigset_t newmask;
// °á°úÀÇ È®ÀÎÀ» À§Çؼ ¾²·¹µå ID¸¦ Ãâ·ÂÇÑ´Ù.
printf("SIGINT Thread Start %d\n", pthread_self());
sigemptyset(&newmask);
sigaddset(&newmask, SIGINT);
act.sa_handler = sig_handler;
sigaction(SIGINT, &act, NULL);
while(1)
{
printf("%d\n", i);
i++;
sleep(1);
}
return ;
}
void *threadfunc2(void *arg)
{
struct sigaction act;
sigset_t newmask;
sigemptyset(&newmask);
sigaddset(&newmask, SIGINT);
act.sa_handler = sig_handler;
sigaction(SIGINT, &ct, NULL);
while(1)
{
sleep(1);
}
}
/*
* SIGINT¸¦ µÎ°³ÀÇ ¾²·¹µå·Î ¼·Î´Ù¸¥ ½Ã°£°£°ÝÀ¸·Î
* Àü´ÞÇÑ´Ù.
*/
void *s_signal(void *arg)
{
int i = 1;
while(1)
{
sleep(1);
i++;
if((i % 7) == 0)
{
printf("Send SIGINT %d\n", sigid[0]);
pthread_kill(sigid[0], SIGINT);
}
if((i % 11) == 0)
{
printf("Send SIGINT %d\n", sigid[1]);
pthread_kill(sigid[1], SIGINT);
}
}
}
|
À§ÀÇ ÄÚµåÀÇ °æ¿ì ½Ã±×³ÎÀ» ¹ÞÀ» ¾²·¹µå¸¦ ¸í½ÃÇØÁÙ ¼ö ÀÖÀ¸¹Ç·Î
½Ã±×³Î ¸¶½ºÅ©µîÀ» ¼³Ä¡ÇÒ Çʿ䰡 ¾ø´Ù. SIGINT°¡ ¿øÇÏ´Â ¾²·¹µå·Î
Á¤È®ÇÏ°Ô Àü´ÞµÇ´Â°É È®ÀÎÇÒ ¼ö ÀÖÀ» °ÍÀÌ´Ù.
1.2.4. ½Ã±×³ÎÀ» ÀÌ¿ëÇÑ ¾²·¹µå ÀÛµ¿ Á¦¾î ¾²·¹µå ÇÁ·Î±×·¡¹ÖÀ» ÇÏ´Ùº¸¸é ºñµ¿±â ÀûÀ¸·Î ƯÁ¤ ¾²·¹µå¸¦
Áß´Ü ½ÃÄÑ¾ß µÇ´Â °æ¿ì°¡ ¹ß»ýÇÑ´Ù. ¹°·Ð ÀÓÀÇÀÇ ½ÃÁ¡¿¡¼
Áß´ÜµÈ ¾²·¹µå¸¦ ´Ù½Ã ÀÛµ¿Çϵµ·Ï ¸¸µé¾î ÁÖ¾î¾ß ÇÒ°ÍÀÌ´Ù.
´Ù¸¥ ¿ìȸÀûÀÎ ¸î°¡Áö ±¸Çö ¹æ¹ýÀÌ ÀÖ°ÚÁö¸¸ ºñµ¿±âÀûÀΠ󸮸¦
À§Çؼ´Â ¿ª½Ã ½Ã±×³Î¸¸ÇÑ°Ô ¾ø´Â °Í °°´Ù.
#include <pthread.h>
#include <stdlib.h>
#include <unistd.h>
#include <signal.h>
#include <stdio.h>
pthread_t thread_t[3];
void sig_handler(int signo)
{
printf("Thread Stop %d:\n", (int)pthread_self());
sleep(100);
}
void null(int signo)
{
printf("Thread Start\n");
}
void *test(void *data)
{
sigset_t newmask;
struct sigaction act, act2;
int i = 0;
sigemptyset(&newmask);
sigaddset(&newmask, SIGUSR1);
sigaddset(&newmask, SIGCONT);
act.sa_handler = sig_handler;
act2.sa_handler = null;
sigaction(SIGUSR1, &act, NULL);
sigaction(SIGCONT, &act2, NULL);
pthread_sigmask(SIG_UNBLOCK, &newmask, NULL);
while(1)
{
printf("Im child Thread %d %d\n", (int)pthread_self(),i);
i++;
sleep(1);
}
}
void *worker(void *data)
{
sigset_t newmask;
sigemptyset(&newmask);
sigaddset(&newmask, SIGUSR1);
sigaddset(&newmask, SIGCONT);
pthread_sigmask(SIG_BLOCK, &newmask, NULL);
while(1)
{
sleep(2);
pthread_kill(thread_t[0], SIGUSR1);
sleep(3);
pthread_kill(thread_t[0], SIGCONT);
}
}
int main()
{
pthread_create(&thread_t[0], NULL, test, NULL);
pthread_create(&thread_t[1], NULL, test, NULL);
pthread_create(&thread_t[2], NULL, worker, NULL);
pthread_join(thread_t[0], NULL);
pthread_join(thread_t[1], NULL);
return 1;
}
|
1.3. ¿î¿µÃ¼Á¦º° Â÷ÀÌÁ¡ ¾²·¹µåÀÇ ÀÛµ¿¹æ½ÄÀº ¿î¿µÃ¼Á¦º°·Î ¸¹Àº Â÷À̸¦ º¸¿©ÁÙ ¼ö ÀÖÀ¸¸ç, Â÷ÀÌÁ¡¿¡
À¯ÀÇÇØ¼ ÇÁ·Î±×·¥À» ÀÛ¼ºÇØ¾ß ÇÑ´Ù. ¿©±â¿¡¼´Â ¼Ö¶ó¸®½º¿Í ¸®´ª½º¸¦
ºñ±³Çؼ ¼³¸íÇϵµ·Ï ÇϰڴÙ.
Áö±Ý±îÁöÀÇ ¾²·¹µå¿Í ½Ã±×³Î¿¡ ´ëÇØ¼ ´Ù·ç¾ú´ø ³»¿ëÀº ¼Ö¶ó¸®½º¿Í °°ÀÌ
ÇϳªÀÇ ÇÁ·Î¼¼½º¿¡¼ ´ÙÁßÀÇ ¾²·¹µå¸¦ °ü¸®ÇÏ´Â °æ¿ì¸¦ ±âÁØÀ¸·Î Çß´Ù.
±×·¯³ª ¸®´ª½ºÀÇ °æ¿ì clone(2)¸¦ ÅëÇÑ ´ÙÁß ÇÁ·Î¼¼½ºÇüÅ·Π¾²·¹µå°¡
»ý¼ºµÈ´Ù. ¶§¹®¿¡ ps¸¦ ÀÌ¿ëÇØ¼ È®ÀÎÇÒ °æ¿ì ´ÙÁß ¾²·¹µå ÇÁ·Î¼¼½ºÀÓ¿¡µµ
ºÒ±¸ÇÏ°í °¢°¢ÀÇ PID¸¦ °¡Áö´Â ÇÁ·Î¼¼½º·Î ¾²·¹µå°¡ »ý¼ºµÇ´Â°É È®ÀÎ ÇÒ ¼ö
ÀÖ´Ù.
ÀÌ·± Ư¡ ¶§¹®¿¡ ¸®´ª½º ½Ã½ºÅÛ¿¡¼ ¿ÜºÎ ÇÁ·Î¼¼½º¿¡¼ ½Ã±×³ÎÀ» ƯÁ¤ ¾²·¹µå·Î º¸³¾ °æ¿ì¿¡´Â
¸ÞÀÎ ¾²·¹µå°¡ ¾Æ´Ñ ÇØ´ç ¾²·¹µåÀÇ PID¸¦ ¸í½ÃÇØ ÁÖ¾î¾ß ÇÑ´Ù.
Cache Error
|
|