sigaction 사용예제
"signal()" 함수로 사용하면 편리하지만 간혹 세부적인 signal 특성을 제어해야 할 필요성이 있는 경우가 있을겁니다. 그때 sigaction을 많이 사용하게 됩니다.
아래의 예제는 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 */ |


mzsigaction.tar.bz2

댓글을 달아 주세요