linux man page : sigaction - ½Ã±×³ÎÀ» ó¸®ÇÑ´Ù.
ÃÑ ÆäÀÌÁö ¼ö : 3224

Àüü ÇÔ¼ö/¿ë¾î»çÀü
Facebook Joinc ±×·ì   Joinc QA »çÀÌÆ®



joinc´Â Firefox¿Í chrome¿¡¼­ Å×½ºÆ® Çß½À´Ï´Ù. IE¿¡¼­´Â Å×À̺íÀÌ ±úÁö°Å³ª À̹ÌÁö°¡ º¸ÀÌÁö ¾ÊÀ» ¼ö ÀÖ½À´Ï´Ù. ƯÈ÷ ±¸±Û DocsÀ̹ÌÁöÀÇ °æ¿ì ¿¢¹Úó¸®µÉ ¼ö ÀÖ½À´Ï´Ù.
Docbook ¿ø¹®

<a href="/modules/moniwiki/wiki.php/manSearch?google=none&name=sigaction">sigaction</a>(2)

1장. 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±¸Á¶Ã¼´Â ´ÙÀ½°ú °°ÀÌ Á¤ÀǵǾî ÀÖ´Ù.

struct sigaction 
{
    void (*sa_handler)(int);
    void (*sa_sigaction)(int, siginfo_t *, void *);
    sigset_t sa_mask;
    int sa_flags;
    void (*sa_restorer)(void);
}
		

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");
}
		

EmailÀ» ±âÀÔÇϸé, ´ñ±ÛÀÌ ¸ÞÀÏ·Î Àü´ÞµË´Ï´Ù.