signal 처리에 관한 질문입니다.
글쓴이: kkjin32 / 작성시간: 목, 2005/02/24 - 11:15오전
어플리케이션 개발중 signal에 관한 질문 올립니다.
Database insert중에는 sinal을 SIG_IGN으로 무시 해버리고 있습니다.
그런후에 insert가 끝나면 다시 signal()로 signal을 받도록 했습니다.
그런데 무시한 signal중 일부는 꼭 받아야 하는 signal인 경우에 그 signal을 다시 받거나, 잠시 미루어 두었다가 처리하는 방법이 없을까요?
signal을 보내는쪽에서 signal을 보내지 말아야하는 시점을 알아내는 방법은 없을까요?
답변 부탁드립니다.
감사합니다.
Forums:


시그널을 시점을 지정하는 건 잘 모르겠지만...일단 시그널을 받으면
시그널을 시점을 지정하는 건 잘 모르겠지만...
일단 시그널을 받으면 받은 시그널은 check해 두었다가 하고자 하는 작업이 끝난 후에 check된 시그널들을 따로 처리하는 방식으로 하는 방법도 한 번 생각을 해볼 수도 있을것 같네요.
<어떠한 역경에도 굴하지 않는 '하양 지훈'>
#include <com.h> <C2H5OH.h> <woman.h>
do { if (com) hacking(); if (money) drinking(); if (women) loving(); } while (1);
시그널을 보내는 시점을 알아내는 방법을 구현하는 것 보다는, 다른 방법으
시그널을 보내는 시점을 알아내는 방법을 구현하는 것 보다는, 다른 방법으로 처리하는게 좋지 않을까요?
어떤 어플리케이션인지 모르겠지만, 다른 프로세스로부터 중요한 이벤트를 받는 것이라면, 다른 방식(IPC나 소켓.. 등등)으로 구현하는게 나을 것 같습니다.
--
종이한장 * 이성으로 비관하더라도 의지로 낙관하라! (그람시)
signal 명령은 단지 시그널이 들어 왔을 때 호출되는 핸들러를 지정할
signal 명령은 단지 시그널이 들어 왔을 때 호출되는 핸들러를 지정할 뿐입니다.
요새 깔끔한 프로그램은 그것보다는 sigaction을 사용하고,
kkjin32님께서 원하시는 것은 핸들러 지정으로 해결될 문제가 아니고, 잠시 시그널을 멈췄다가 재개하는 방법을 사용하셔야합니다.
#include <unistd.h> #include <stdio.h> #include <signal.h> void func( int sig ) { printf("hi.. %d\n", sig); } int main() { struct sigaction sa; sigset_t ss; if( fork() > 0 ) exit(0); memset( &sa, 0, sizeof sa ); sa.sa_handler = func; sigaction( SIGUSR1, & sa, 0 ); sigemptyset( & ss ); sigaddset( & ss, SIGUSR1 ); sigprocmask( SIG_BLOCK, & ss, 0 ); printf("do it now!\n" ); printf("kill -SIGUSR1 %d\n", getpid() ); printf("Sleeping 10 sec..\n" ); sleep(10); printf("Unblocking..\n" ); printf("Sleeping 10 sec..\n" ); sigprocmask( SIG_UNBLOCK, &ss, 0 ); sleep(10); return 0; }참고하세요.
위의 코드는, 10초간 쉬는 동안 SIGUSR1을 보내어도 반응하지 않다가 10초가 끝난 직후 그동안 SIGUSR1이 들어 왔을 경우 바로 시그널 처리를 하는 예제입니다.
---
http://coolengineer.com
[quote="pynoos"]참고하세요.위의 코드는, 10초간 쉬는
블러킹중에 같은 시그널이 여러번 발생할 경우엔 한번 밖에 처리하지 못하기 때문에 개인적으론 반드시 처리해야 하는 이벤트라면 시그널 방식은 꺼리는 편입니다. ^^
--
종이한장 * 이성으로 비관하더라도 의지로 낙관하라! (그람시)
그렇죠.. 저런 문제가 있습니다. 간과해서는 안되는 문제이지요.시그널
그렇죠.. 저런 문제가 있습니다. 간과해서는 안되는 문제이지요.
시그널이 중요한 메시지를 주고 받는 수단이 되어서는 안됩니다.
---
http://coolengineer.com
흠..저도 시그널은 싫지만...
매우 늦게 답변을 올립니다 ㅎㅎ.. 심심해서..
블러킹된 횟수도 알수 있습니다.
운영체제마다 지원하지 않을수도 있지만..
솔라리스와 리눅스에서는 되던데요..
@.@
댓글 달기