RTS를 쓴 [ 스레드 ]에서 프로그램전체가 블럭되어버립니다.
글쓴이: ctcquatre / 작성시간: 금, 2005/04/29 - 2:40오후
모니터링 서버를 만들고 있습니다. 서버의 모니터링 결과를 클리이언트로 보내주는겁니다.
여기분들의 도움을 받아 이것저것 생각해볼수있었습니다.
select로 처리를 생각해봤는데 이렇게 저렇게 찾아보다
여기까지 와서 RTS라는 아주 좋은(?)것을 알게 되었습니다.
그래서 지금 어느정도 테스트 코드를 구현해봤는데..
역시나 다를까 문제가 생기네요.
프로그램 구성은
[main()->소켓처리->스레드 생성 -> 리소스 수집작업]
[스레드부분 (패킷교환작업)]
이렇게 되어있습니다.
스레드 생성 부분에서 소켓에 대해 신호를 설정하고 뭐 이런작업을 하는데
sigwaitinfo()함수 호출부분에서 멈춰버립니다.
블럭되는건 스레드 내에서 되야 리소스 수집작업이 돌아가는데
아예 스레드를 쓰지 않은것처럼 프로그램전체가 블럭되어 버립니다. 따라서 collectResource부분에서 while문장안에 코드가
작동하지 않습니다.
아래는 메인의 대략적인 소스입니다.
main { createsocket(); pthread_create(threadID,NULL,SignalProcess,NULL); collectResource(); } void colloectResource() { while(1) { printf("collect resource.....\n"); sleep(5); } }
아래는 스레드 소스입니다.
void Set_signalIO(int socket) //시그널 설정 { if(fcntl(socket,F_SETFL,O_RDWR | O_NONBLOCK | O_ASYNC) < 0) DieWithError("fcntl function's signal setting failed"); if(fcntl(socket,F_SETSIG,SIGRTMIN) < 0) DieWithError("fcntl function's signal setting failed"); if(fcntl(socket,F_SETOWN,getpid()) < 0) DieWithError("fcntl function's signal setting failed"); } void * SignalProcess() // 스레드 함수 { struct siginfo sigInfo; sigset_t sigSet; int sigRet; Set_signalIO(serverData.socket); // 위에 함수 있습니다. pthread_detach(pthread_self()); sigemptyset(&sigSet); sigaddset(&sigSet,SIGRTMIN); pthread_sigmask(SIG_BLOCK, &sigSet, NULL); while(1) { sigRet=sigwaitinfo(&sigSet,&sigInfo); // <--- 이부분을 주석처리하면 리소스 수집이 가능합니다. if(sigRet == SIGRTMIN) { printf("intern"); if(sigInfo.si_fd=serverData.socket) { AllowAccept(); } else { clientTon(clientData.socket); } } } }
왜 sigwaitinfo()함수가 프로그램 전체를 블럭해버릴까요?
분명 시그널 처리는 스레드 안에서만 진행되고, sigwaitinfo함수를 호출한것도
스레도 안에서 인데.. 도무지 이해가 가지 않습니다.
조언 부탁드립니다.
좋은 하루되세요.
Forums:
void * SignalProcess() // 스레드 함수에서s
void * SignalProcess() // 스레드 함수에서
sigwaitinfo()를 쓰지 않고
블럭시간을 정하는
sigtimedwait() 에 시간을 한 2초나 3초정도로 주니
블럭을 빠져나온 다음에는 나머지 main코드가 잘 실행됩니다.
다시 sigtimedwait로 블럭되어버리면 main코드는 실행을
멈추고, 이런식으로 반복됩니다.
이걸로 보아 sigwaitinfo가 프로그램 전체를 블럭시키는게
확실한듯 합니다.
좀더 찾아봤는데
getpid가 예전에는 스레드id를 반환했었는데
이제는 부모프로세스와 같은 id를 반환하더군요.
그래서 gettid를 써라고 하던데.. 흠..
man page보고 sys/types.h , linux/unistd.h까 포함시켜줘도
함수정의를 찾지 못합니다.
void Set_signalIO(int socket) //시그널 설정
이함수에서
if(fcntl(socket,F_SETOWN,getpid()) < 0)
이렇게 main프로세서 id를 지정하는데 그때문에
sigwaitinfo문이 프로그램 전체를 블럭 시켜버리는걸까요?
흠.. 상관이 있는듯 하면서도, 상관이 없는듯도 하고..
경험이 있거나, 아시는분 좀 도와주세요 ^^; 이것저것
찾아 떠돌아다니다가.. 이제는 그자료가 그 자료군요.
검색만으로는 좀 힘들것 같습니다.
Chaos to Cosmos,
Chaos to Chaos,
Cosmos to Cosmos,
Cosmos to Chaos.
댓글 달기