sigwaitinfo에서 죽네요

cb2531의 이미지

Real Time Signal 방식으로 네트웍을 구현해서 접속을 시켰더니
sigwaitinfo 부분에서
실-시각 시그널 0
이런 메세지가 뿌려지면서 에러를 리턴할 겨를도 없이 프로그램이 죽네요
(0이란 숫자는 set 에 등록시킨 시그널입니다. 다른거 등록하면 다른 숫자가.. )

근데 같은 소스를 함수에 넣고 실행하면 괜찮은데
스레드에 넣고 실행하면 저렇게 되는게 수상해서 질문 올립니다
겪어보신 분의 조언을 구합니다 ^^

참고로 커널 버전은 2.6.9-34 입니다.

체스맨의 이미지

혹시 스레드에서 sigprocmask 대신 pthread_sigmask 는 호출하셨는지요?
뭐 이것때문에 죽었는지는 모르겠습니다. 잘 안되시면 죽는 소스를 축약해서 올려주시면 왜 죽는지 생각해보는데 도움이 될 것 같네요.

Coral Library Project : http://coral.kldp.net
Orion Project : http://home.megapass.net/~heesc22/

Orion Project : http://orionids.org

poplike의 이미지

지식 공유 하고자 올립니다.

저도 같은 문제로 검색에 검색을 해보았지만 시원한 답변이 나오질 않네요..^^;;

일단 4~5시간 삽질 해 본 결과로 getpid() 요놈에 의한것으로 판단이 됩니다.

리눅스 2.4 kernel 에서의 getpid() 는 각 쓰레드의 고유값이 나온다고 하는군요. (2.4 kernel 시스템이 없어서 테스트는 못해봤습니다.)

현재 리눅스 2.6 kernel 에서는 완벽한 쓰레드 지원(?) 이라 하여 프로세스 아이디는 공유를 하고

gettid() 함수로 쓰레드 ID가 있더군요.;;

gettid() 썼는데 컴파일 에러가 난다면

---------------------------------------------
#include

#define gettid() (long int)syscall(__NR_gettid)
---------------------------------------------

요 놈들을 추가 시켜 주고 gettid() 를 쓰시면 되겠습니다 ^^

결론

RTS 방식의 2.4용 네트워크 예제 소스중

getpid() 값을 키 값으로 활용하기 때문에 발생 하는 문제로

getpid() 함수를 gettid() 함수로 바꿔주시면 잘 작동합니다.