[완료] 데몬이 종료시그널을 받기전까지 블럭시킬려면 어떻게 해야되나요??
글쓴이: amiwinner / 작성시간: 화, 2007/10/16 - 2:29오후
안녕하세요.
윈도우 프밍만하다가 리눅스를 할려니 익숙치 않아서 고생이 많네요.ㅠ.ㅠ.
왠만큼 코드를 옮기고 데몬으로 돌아가게끔 하렬고 합니다.
데몬으로 설정하는 부분은 해놨는데..
이전 콘솔모드에서는 getch()를이용해서 특정문자열이 입력되면 루프가 풀려서
각 객체들의 종료작업을 해주고 프로세스가 죽게끔 했었는데요..
데몬으로 돌리다보니..이부분을 어떻게 처리해주어야 할지 잘 모르겠네요.
그냥 봐서는 특정시그널을 받을때까지 블럭하고 있다가 시그널이 도착하면
블럭이 풀려서 종료작업을 해주면 될듯한데..
어떤 함수들을 사용해서 만들어 주어야 하는지 잘 모르겠습니다.
자료를 찾아보니 kill pid 하면 SIGTERM이 날라간다고 본거 같은데..
보통 어덯게 처리해주면 되나요?
고수님들의 도움좀 부탁합니다.
Forums:


이래저래해서..
signal()과 pause()를 조합해서 해봤는데..적당한 방법인지..고수님들 도움좀 주세요.ㅠ.
signal은 kill xxxx 할때 발생하는 SIGTERM 으로 처리했습니다.
종료 시그널을
종료 시그널을 받을때까지 라고 써놓으셨는데
꼭 종료 시그널이어야하는가요?
또 꼭 시그널( SIGTERM 이라던지 )이어야 하는가요?
단지 특정 신호를 받기전까지 대기 상태로 빠지게 해놓는거면
그냥 파이프나 소켓을 열어 놓고 신호가 올때까지 기다리거나( 그냥 sync I/O를 쓰시면 되겠죠. )
뭐..꼭 종료 시그널로만 처리하고 싶으시다면
저 같음 mutex같은걸로 lock을 걸어놓고
SIGTERM signal handler에서 해당 lock을 풀어버리겠네요
하지만, 특정 조건이 만족 될 때까지 아무것도 안하는 로직을 원하시는것 뿐이라면
저 같음 굳이 시그널을 쓰진 않겠네요. 소켓이나 파이프가 나을듯..
mutex
시그널 핸들러 안에서 mutex 를 사용하면 안됩니다.
리눅스에서 사용하는
리눅스에서 사용하는 daemon에 대한 자세한 설명 및 예제 코드는 아래를 참고하시고요...
http://wiki.kldp.org/wiki.php/daemon
아래의 코드는 일반적인 종료 시그널(SIGINT 및 SIGTERM)에 의해 종료되는 application의 작성 예입니다. 이를 참고하셔서 다양한 동작의 작업을 수행하도록 응용하실 수 있을 겁니다.
boolean Daemonize() { pid_t pid; if ( (pid = fork()) < 0 ) { PERROR("fail to daemonize\n"); return FALSE; } else if (pid != 0) { exit(0); // parent goes bye-bye } // child continues setsid(); // become session leader chdir("/"); // change working directory umask(0); return TRUE; } boolean InitSignalSetForTermination(sigset_t* a_sigset) { if ( !a_sigset ) { PERROR("arg is NULL\n"); return FALSE; } if ( sigemptyset(a_sigset) == -1 || sigaddset(a_sigset, SIGINT) == -1 || sigaddset(a_sigset, SIGTERM) == -1 ) { PERROR("fail to init signal set\n"); return FALSE; } return TRUE; } boolean BlockSignalsOfSignalSet(sigset_t* a_sigset) { int retCode; if ( !a_sigset ) { PERROR("arg is NULL\n"); return FALSE; } retCode = pthread_sigmask(SIG_BLOCK, a_sigset, NULL); if ( retCode ) { PERROR("fail to set signal mask: %d\n", retCode ); return FALSE; } return TRUE; } int WaitUntilWantedSignalReceived(sigset_t* a_sigset) { if ( !a_sigset ) { PERROR("arg is NULL\n"); return FALSE; } while ( TRUE ) { int sigNum; int result = 0; sigwait(a_sigset, &sigNum); result = sigismember(a_sigset, sigNum); if ( result == 1 ) { PDEBUG("wanted signal(%d) is received\n", sigNum); return sigNum; } if ( result == -1 ) { PDEBUG("fail to check received signal(%d)\n", sigNum); break; } PDEBUG("other signal(%d) is received\n", sigNum); } return -1; } void CreateYourOwnWorkingThreads(); void DeleteYourOwnWorkingThreads(); int main() { sigset_t sigSet; Daemonize(); InitSignalSetForTermination(&sigSet); BlockSignalsOfSignalSet(&sigSet); CreateYourOwnWorkingThreads(); WaitUntilWantedSignalReceived(&sigSet); DeleteYourOwnWorkingThreads(); return 0; }감사합니다.
답변 감사드립니다.
댓글 달기