|
Facebook Joinc ±×·ì
Joinc QA »çÀÌÆ®
joinc´Â Firefox¿Í chrome¿¡¼ Å×½ºÆ® Çß½À´Ï´Ù. IE¿¡¼´Â Å×À̺íÀÌ ±úÁö°Å³ª À̹ÌÁö°¡ º¸ÀÌÁö ¾ÊÀ» ¼ö ÀÖ½À´Ï´Ù. ƯÈ÷ ±¸±Û DocsÀ̹ÌÁöÀÇ °æ¿ì ¿¢¹Úó¸®µÉ ¼ö ÀÖ½À´Ï´Ù.
Docbook ¿ø¹®
sigaction(2) ½Ã±×³Î 󸮰ü·Ã ÇÔ¼ö
1.1. »ç¿ë¹ý #include <signal.h>
int sigaction(int signum, const struct sigaction *act,
struct sigaction *oldact);
int sigprocmask(int how, const sigset_t *set, sigset_t *oldset);
int sigpending(sigset_t *set);
int sigsuspend(const sigset_t *mask);
|
1.2. ¼³¸í sigaction() ½Ã½ºÅÛ È£ÃâÀº ƯÁ¤ ½Ã±×³ÎÀÇ ¼ö½Å¿¡ ´ëÇØ¼ ÃëÇÒ ¾×¼ÇÀ»
¼³Á¤Çϰųª º¯°æÇϱâ À§Çؼ »ç¿ëµÈ´Ù.
signum´Â ½Ã±×³ÎÀ» ¸í½ÃÇÑ´Ù. SIGKILL°ú SIGSTOP¸¦
Á¦¿ÜÇÑ ¸ðµç ½Ã±×³ÎÀÌ Å¸´çÇÑ ½Ã±×³ÎÀÌ µÉ ¼ö ÀÖ´Ù.
¸¸¾à act°¡ nullÀÌ ¾Æ´Ï¶ó¸é
signum¹øÈ£¸¦ °¡Áö´Â ½Ã±×³Î¿¡ ´ëÇØ¼ actÇÔ¼ö°¡ ¼³Ä¡µÈ´Ù.
¸¸¾à oldact°¡ nullÀÌ ¾Æ´Ï¶ó¸é ÀÌÀüÀÇ ¾×¼ÇÀº
oldact¿¡ ÀúÀåµÈ´Ù.
sigaction±¸Á¶Ã¼´Â ´ÙÀ½°ú °°ÀÌ Á¤ÀǵǾî ÀÖ´Ù.
- sa_handler
signum¹øÈ£¸¦ °¡Áö´Â ½Ã±×³ÎÀÌ ¹ß»ýÇßÀ» ¶§ ½ÇÇàµÈ ÇÔ¼ö¸¦
¼³Ä¡ÇÑ´Ù. ÇÔ¼ö¿Ü¿¡µµ SIG_DFL°ú SIG_IGNÀ» ÁöÁ¤ÇÒ ¼ö ÀÖ´Ù.
ÀüÀÚ´Â ½Ã±×³Î¿¡ ´ëÇÑ ±âº»ÇൿÀ» ÈÄÀÚ´Â ½Ã±×³ÎÀ» ¹«½ÃÇϱâ
À§Çؼ »ç¿ëÇÑ´Ù.
- sa_mask
sa_handler¿¡ µî·ÏµÈ ½Ã±×³Î Çڵ鷯 ÇÔ¼ö°¡ ½ÇÇàµÇ´Â µ¿¾È
ºí·°µÇ¾î¾ß ÇÏ´Â ½Ã±×³ÎÀÇ ¸¶½ºÅ©¸¦ Á¦°øÇÑ´Ù. SA_NOMASK°¡
Àû¿ëµÇ¾î ÀÖÁö ¾Ê´Ù¸é
- sa_flags
½Ã±×³Î ó¸® ÇÁ·Î¼¼½ºÀÇ ÇàÀ§¸¦ ¼öÁ¤ÇÏ´Â ÀÏ·ÃÀÇ Ç÷¡±×µéÀ»
¸í½ÃÇÑ´Ù. ´ÙÀ½Áß Çϳª ÀÌ»óÀÇ °Íµé¿¡ ÀÇÇØ¼ ¸¸µé¾î Áø´Ù.
- SA_NOCLDSTOP
¸¸¾à signumÀÌ SIGCHLD¶ó¸é, ÀÚ½Ä ÇÁ·Î¼¼½º°¡ SIGSTOP,
SIGTSTP, SIGTTIN, SIGTTOUµîÀ» ¹Þ¾Æ¼ ÁߴܵǾúÀ» ¶§
À̸¦ ÅëÁö ¹ÞÀ» ¼ö ¾ø°Ô µÈ´Ù.
- SA_ONESHOT, SA_RESETHAND
ÀÏ´Ü ½Ã±×³Î 󸮱Ⱑ È£ÃâµÇ¸é, ±âº» »óÅ¿¡ ´ëÇÑ
½Ã±×³Î ¾×¼ÇÀ» Àç ÀúÀåÇÑ´Ù. ÀÌ´Â signal(2)È£Ãâ¿¡ ´ëÇÑ
±âº» ÇàÀ§ÀÌ´Ù.
- SA_RESTART
ÀϺΠ½Ã½ºÅÛ È£ÃâµéÀÌ ½Ã±×³ÎÀ» ÅëÇØ Àç½ÃÀÛÇÒ ¼ö ÀÖµµ·Ï
ÇÔÀ¸·Î¼ BSD ½Ã±×³Î°ú ȣȯµÇµµ·Ï ÇÑ´Ù.
- SA_NOMASK, SA_NODEFER
½Ã±×³ÎÀÌ ÀÚü ½Ã±×³Î 󸮱â·ÎºÎÅÍ ¼ö½Å ¹ÞÁö ¾Êµµ·Ï ÇÑ´Ù.
- SA_SIGINFO
½Ã±×³Î 󸮱Ⱑ Çϳª°¡ ¾Æ´Ñ 3°³ÀÇ ÀÎÀÚ¸¦ ÃëÇÒ°æ¿ì
sa_handler´ë½Å sigactionÀÇ siginfo_t¸¦ ÀÌ¿ëÇÒ ¼ö
ÀÖ´Ù. siginto_t´Â ´ÙÀ½°ú °°ÀÌ Á¤ÀÇµÈ ±¸Á¶Ã¼ÀÌ´Ù.
siginfo_t {
int si_signo; /* ½Ã±×³Î ³Ñ¹ö */
int si_errno; /* errno °ª */
int si_code; /* ½Ã±×³Î ÄÚµå */
pid_t si_pid; /* ÇÁ·Î¼¼½º ID º¸³»±â */
uid_t si_uid; /* ÇÁ·Î¼¼½º¸¦ Àü¼ÛÇÏ´Â ½ÇÁ¦ »ç¿ëÀÚ ID */
int si_status; /* Exit °ª ¶Ç´Â ½Ã±×³Î */
clock_t si_utime; /* ¼Ò¸ðµÈ »ç¿ëÀÚ ½Ã°£ */
clock_t si_stime; /* ¼Ò¸ðµÈ ½Ã½ºÅÛ ½Ã°£ */
sigval_t si_value; /* ½Ã±×³Î °ª */
int si_int; /* POSIX.1b ½Ã±×³Î */
void * si_ptr; /* POSIX.1b ½Ã±×³Î */
void * si_addr; /* ½ÇÆÐ¸¦ ÃÊ·¡ÇÑ ¸Þ¸ð¸® À§Ä¡ */
int si_band; /* ¹êµå À̺¥Æ® */
int si_fd; /* ÆÄÀÏ ±â¼úÀÚ */
}
|
SIGCHLD ½Ã±×³ÎÀº si_pid, si_uid, si_status, si_utime,
si_stime¸¦ ä¿î´Ù. si_int, si_ptrÀº ½Ã±×³ÎÀÇ ¼Û½ÅÀÚ¿¡
ÀÇÇØ¼ ¸í½ÃµÉ ¼ö ÀÖ´Ù.
si_code´Â ¿Ö ½Ã±×³ÎÀÌ º¸³»Á³´ÂÁö¸¦ Áö½ÃÇÑ´Ù.
sigprocmask()´Â ÇöÀç ºí·ÏµÈ ½Ã±×³ÎµéÀ» º¯°æ½Ã۱â À§Çؼ »ç¿ëÇÑ´Ù.
È£ÃâÀÇ ÇàÀ§´Â how °ªµé¿¡ ´ëÇØ¼ ÀÇÁ¸ÀûÀÌ µÈ´Ù.
how´Â ´ÙÀ½Áß Çϳª¸¦ ¼±ÅÃÇÒ ¼ö ÀÖ´Ù.
- SIG_BLOCK
set¿¡ ¼³Á¤µÈ ½Ã±×³ÎÀ» ºí·° ½Ã±×³Î¼Â¿¡
Ãß°¡½ÃŲ´Ù.
- SIG_UNBLOCK
½Ã±×³Î ¼ÂsetÀÇ ½Ã±×³ÎÀ» ÇöÀçÀÇ ºí·°µÈ
½Ã±×³Î¿¡¼ »èÁ¦ÇÑ´Ù.
- SIG_SETMASK
½Ã±×³Î ¼ÂsetÀÇ ½Ã±×³ÎÀ» ºí·°ÈµÈ ½Ã±×³Î·Î
ÁöÁ¤ÇÑ´Ù.
oldsetÀÌ nullÀÌ ¾Æ´Ï¸é, ½Ã±×³Î ¸¶½ºÅ©ÀÇ ÀÌÀü °ªÀº
oldset¿¡ ÀúÀåµÈ´Ù.
sigpending()ÇÔ¼ö´Â Àü´Þ ½Ã±×³Îµé¿¡ ´ëÇÑ °Ë»ç¸¦ Çã¿ëÇÑ´Ù. Àü´Þ ½Ã±×³ÎµéÀÇ
¸¶½ºÅ©´Â set¿¡ ÀúÀåµÈ´Ù.
sigsuspend()´Â ÇÁ·Î¼¼½ºÀÇ ½Ã±×³Î ¸¶½ºÅ©¸¦ ÀϽÃÀûÀ¸·Î
mask·Î ´ëüÇϰí, ½Ã±×³ÎÀÌ ¼ö½ÅµÉ¶§±îÁö ÇÁ·Î¼¼½º¸¦
ÁßÁö½ÃŲ´Ù.
1.3. ¹Ýȯ°ª ¼º°øÇϸé 0À» ½ÇÆÐÇϸé -1À» ¸®ÅÏÇÑ´Ù.
1.4. ¿¡·¯ - EINVAL
ºÎÀûÀýÇÑ ½Ã±×³ÎÀÌ ÁöÁ¤µÇ°Å³ª. ¹«½ÃÇÒ ¼ö ¾ø´Â SIGKILL
SIGSTOP¿¡ ´ëÇÑ ¾×¼ÇÀ» º¯°æÇϰíÀÚ ÇÒ °æ¿ì
- EFAULT
act, oldact, set, oldset ÀÌ Å¸´çÇÏÁö ¾ÊÀº ¸Þ¸ð¸® ¿µ¿ªÀ»
°¡¸®Å³ °æ¿ì
- EINTR
½Ã½ºÅÛ È£ÃâÀÌ ÀÎÅÍ·´Æ® µÇ¾ú´Ù.
1.5. ¿¹Á¦ #include <signal.h>
#include <unistd.h>
#include <string.h>
#include <stdio.h>
void sig_int(int signo);
void sig_usr(int signo);
int main()
{
int i = 0;
struct sigaction intsig, usrsig;
usrsig.sa_handler = sig_usr;
sigemptyset(&usrsig.sa_mask);
usrsig.sa_flags = 0;
intsig.sa_handler = sig_int;
sigemptyset(&intsig.sa_mask);
intsig.sa_flags = 0;
// SIGINT¿¡ ´ëÇØ¼ sig_int¸¦ µî·ÏÇÑ´Ù.
if (sigaction(SIGINT, &intsig, 0) == -1)
{
printf ("signal(SIGINT) error");
return -1;
}
// SIGUSR2¿¡ ´ëÇØ¼ usrsig¸¦ µî·ÏÇÑ´Ù.
if (sigaction(SIGUSR2, &usrsig, 0) == -1)
{
printf ("signal(SIGUSR2) error");
return -1;
}
while(1)
{
printf("%d\n", i);
i++;
sleep(1);
}
}
void sig_int(int signo)
{
sigset_t sigset, oldset;
// Çڵ鷯°¡ ¼öÇàµÇ´Â µ¿¾È ¼ö½ÅµÇ´Â ¸ðµç ½Ã±×³Î¿¡ ´ëÇØ¼
// ºí·°ÇÑ´Ù.
sigfillset(&sigset);
if (sigprocmask(SIG_BLOCK, &sigset, &oldset) < 0)
{
printf("sigprocmask %d error \n", signo);
}
fprintf(stderr, "SIGINT !!!!\n");
sleep(5);
}
void sig_usr(int signo)
{
printf("sig_usr2\n");
}
|
|
|