user-defined signal이 두 개 이상 필요할 땐 어떻게 해야 하나요?
리눅스에서 멀티스레드 기반으로 프로그램을 작성하고 있습니다.
프로그램 구조는 단순합니다. 하나의 메인 스레드가 있고, 복수개의 하위 스레드(같은 함수로 생성되는)가 있어서 메인 스레드는 특정 타이밍마다 하위 스레드를 깨워서 일시키는.. 그런 구조인데요.
pthread에서 suspend, resume이 필요한 구조여서 하위 스레드에 SIGUSR1에 대한 핸들러를 등록해놓고 메인 스레드에서 pthread_kill()함수로 SIGUSR1을 해당 하위 스레드에 날리고 하위 스레드는 sigwait()으로 기다리고 있다가 날아오면 할 일 하는 방식입니다.
문제가 있는데, 프로그램을 실행시키다보면 실행중에 아무때나 segmentation fault가 발생합니다. 디버깅해보니 SIGSEGV가 날아왔다고 인식해서 발생하는 것으로 확인되었습니다.
실행도중에 임의의 타이밍에 발생하는 문제라 왜 이러는지도 잘 모르겠고, 검색해봐도 잘 안 나오네요 ㅠㅠ 복수개의 하위 스레드가 SIGUSR1이라는 같은 시그널을 동시에 sigwait()으로 기다리는 상황이어서 생기는 것으로 추측..은 하고 있지만 설령 이게 맞다고 한들 어떻게 해결해야 할지도 막막합니다.
제가 하려는 것은 멀티스레드 기반에서 하나의 상위 스레드가 복수개의 하위 스레드를 원하는 타이밍에 suspend/resume시키는 것입니다. 필요한 경우 하위 스레드가 스스로 임의의 타이밍에 suspend되기도 하는 것이구요. pthread_kill과 sigwait을 사용하는게 나을 것 같아서 써봤는데 막막하네요..ㅠㅠ
SIGUSR1을 여러 스레드가 동시에 기다리는 것이 문제인가싶어서 SIGUSR을 더 많이 써보려고 했는데, 아시다시피 SIGUSR1, 2밖에 없는 관계로 이것도 못할 것 같습니다. 가능하다면 두 개 이상을 써보고 싶은데 정의자체가 안 되어 있으니까요.. 혹시 방법이 있을까요?
고수님들의 많은 도움 부탁드립니다..^^; 아래는 제가 gdb로 디버깅한 로그입니다. Thread 0xb7dfbb40 이 메인 스레드입니다.
Program received signal SIGSEGV, Segmentation fault.
[Switching to Thread 0xb7dfbb40 (LWP 25895)]
0xb7e32580 in ?? () from /lib/i386-linux-gnu/libc.so.6
(gdb) bt
#0 0xb7e32580 in ?? () from /lib/i386-linux-gnu/libc.so.6
#1 0xb7e32337 in strtol () from /lib/i386-linux-gnu/libc.so.6
#2 0x08049093 in atoi (__nptr=) at /usr/include/stdlib.h:286
#3 make_command (from_server=0xb7dfaf00 "") at client_our_test.c:471
#4 0x0804bb8f in main_thread (data=0x0) at client_our_test.c:403
#5 0xb7faed4c in start_thread () from /lib/i386-linux-gnu/libpthread.so.0
#6 0xb7eecd3e in clone () from /lib/i386-linux-gnu/libc.so.6
make_command 함수 내용에 문제가 있어
make_command 함수 내용에 문제가 있어 보입니다. 시그널과 상관없을 수도 있겠네요
---
http://coolengineer.com
해결했습니다. 감사합니다.
프로그램에서 TCP/IP 통신을 하는데, 원인을 알 수 없는(-_-;;) echo가 발생해서 make_command에 들어오면 안 되는 값이 들어온 것이 문제였습니다.
덕분에 빠르게 해결했네요. 감사합니다. (_ _)
...
시그널과 상관없다는 데 백만표 던집니다.
atoi에 들어가는 인자가 NULL이거나 잘못된 포인터가 아닌지 확인해보세요.
+1
..
--
해결했습니다. 감사합니다.
말씀하신대로 시그널과는 상관이 없었고, 왜인지 모르겠는(-_-;;) echo가 발생하면서 무조건 정수가 들어와야 하는 부분에 double형의 데이터가 들어와 atoi가 정상적으로 수행되지 못한게 문제였습니다.
현재는 프로그램 자체를 대폭 수정해서 문제를 다 해결한 상태입니다. 조언 감사합니다 (_ _)
댓글 달기