'signal'에 해당되는 글 2건

sigaction 사용예제

"signal()" 함수로 사용하면 편리하지만 간혹 세부적인 signal 특성을 제어해야 할 필요성이 있는 경우가 있을겁니다. 그때 sigaction을 많이 사용하게 됩니다.
아래의 예제는 sigaction을 어떻게 사용하는지 예제로 만들어 본겁니다.

코드:
/*
 Copyright (C) Information Equipment co.,LTD.
 All rights reserved.
 Code by JaeHyuk Cho <mailto:minzkn@infoeq.com>
 CVSTAG="$Header$"
*/

#include <stdio.h>
#include <string.h>
#include <signal.h>
#include <unistd.h>

static volatile int g_mzapi_break_count = 0;

static void my_signal_handler(int s_signal)
{
 g_mzapi_break_count++;
 (void)fprintf(stdout, "signal = %d, repeat_count=%d\n", s_signal, g_mzapi_break_count);
}

static void (* (mzapi_signal)(int s_signal_number, void (*s_handler)(int)))(int)
{
 struct sigaction s_sigaction, s_prev_sigaction;
#if defined(SIG_ERR)
# if defined(NSIG)
 if((s_handler == SIG_ERR) || (s_signal_number < ((int)1)) || (s_signal_number >= ((int)(NSIG))))return(SIG_ERR);
#else
 if(s_handler == SIG_ERR)return(SIG_ERR);
# endif
#endif
 (void)memset((void *)(&s_sigaction), 0, (size_t)sizeof(s_sigaction));
 if(sigemptyset(&s_sigaction.sa_mask) == (-1))return(SIG_ERR);
 if(sigaddset(&s_sigaction.sa_mask, s_signal_number) == (-1))return(SIG_ERR);
 s_sigaction.sa_handler = s_handler, s_sigaction.sa_flags = 0;
 (void)memset((void *)(&s_prev_sigaction), 0, (size_t)sizeof(s_prev_sigaction));
 if(sigaction((int)s_signal_number, (struct sigaction *)(&s_sigaction), (struct sigaction *)(&s_prev_sigaction)) == (-1))return(SIG_ERR);
 return((void (*)(int))(s_prev_sigaction.sa_handler));
}

int (main)(void)
{
 void (*s_old_signal_vector)(int);
 s_old_signal_vector = mzapi_signal(SIGINT, my_signal_handler);
 (void)fprintf(stdout, "CTRL + c key !\n");
 do { sleep(1); }while(g_mzapi_break_count < 3);
 (void)fprintf(stdout, "End of sigaction test\n");
 return(0);
}

/* End of source */

크리에이티브 커먼즈 라이센스
Creative Commons License
Posted by minzkn

트랙백 주소 :: http://blog.minzkn.com/trackback/154

댓글을 달아 주세요