스레드와 알람 시그널 (솔라리스)
글쓴이: pjs0722 / 작성시간: 월, 2004/08/23 - 10:32오전
안녕하십니까!!
통신프로그램을 짜고 있는데.... 시그널 처리 때문에 질문을 드립니다.
일단 구조를 말씀 드리면
메인에서 스레드 하나를 호출하여
이 스레드에서 accept()를 합니다..
클라이언트가 접속하면 accept() 를 실행하는 스레드에서
스레드를 호출하여 클라이언트와 연결시킵니다...
이런 후 recv() 를 할때 알람시그널을 이용하여 timeout를 체크합니다.
(왜? select()를 안쓰고 시그널을 쓰냐는 분들이 계실지 몰라 미리 말씀드리는데
사정상 select()는 사용하기가 좀 곤란합니다)
recv() 시 알람시그널을 사용하여 timeout를 체크하면 솔라리스 상에서
해당 스레드에서 이 시그널을 받지 못합니다.
제가 확인 결과 accept() 를 실해하는 스레드로 전달이 되는것 같습니다.
이 알람시그널을 해당 스레드에서 받을 수 있게 하려면 어떻게 해야 할까요?
답변부탁드립니다 .... !! :D
Forums:
좀 힘들지 않을까요?listen 과 accept 할 쓰레드에서
좀 힘들지 않을까요?
listen 과 accept 할 쓰레드에서
알람 시그널을 마스크로 막는다 하여도
실제 클라이언트와 통신 할 쓰레드에서만
시그 알람을 받게 한다면 ...
통신 쓰레드가 여러개 있을 땐 각각의 쓰레드간
어디로 시그날이 갈지 몰라 처리하기 힘들지 않을까요?
ㅋ..
“바람에게도 길은 있다. 나는 비로소 나의 길을 가느니. 길은 언제나 어디에나 있다.”
전역변수로 시그널 개념이 필요한 스레드 갯수만큼 배열 하나 만들어 놓고,
전역변수로 시그널 개념이 필요한 스레드 갯수만큼 배열 하나 만들어 놓고,
특정 엔트리당 특정 스레드로, 영역 충돌 안생기게 고정시켜 놓고,
이벤트가 발생하면 해당 배열의 index를 toggle 시키면
스레드는 저 배열 index를 polling하고 있다가 toggle되면 실행하는..
이런건 안될까요?
가끔 저렇게 프로그래밍 할 때도 있었거든요..흠흠..
https://nicesj.com
https://blog.nicesj.com
음 ....
이벤트가 발생하면 해당 배열의 index를 toggle 시키면
----------------------------------------------------------------------------------
이벤트가 발생하면 이라고 하셨는데 이벤트(즉, 알람시그널)이 되겠지요
그러면 이 이벤트가 어느 스레드의 이벤트인지를 어떻게 알 수 있을까요..?
그리고 해당 스레드에서 toggle 된 것을 모니터링하기 위한 작업을 추가해야
한다는 것인데 ...... 음 .....
현 상황은 스레드가 recv() 하고 있는 상황입니다. 여기서 timeout 를 체크하기
위한 방법을 생각 중이고요 .... 음 ....
^^;
:lol:
대박나세요~
솔라리스에 SO_RCVTIMEO 옵션이 있는지 알아봐주시겠습니까?
솔라리스에 SO_RCVTIMEO 옵션이 있는지 알아봐주시겠습니까?
[quote="bugiii"]솔라리스에 SO_RCVTIMEO 옵션이 있는
------------------------------------------------------------------------------------
제가 테스트해본 봐로는 솔라리스 6 , 7 (32, 64 bit) 그리고 HP UX 10, 11
모두 SO_RCVTIMEO 옵션이 먹질 않더군요 .... ㅠ.ㅠ!!
대박나세요~
문제가 안된다면 select 를 사용하지 못하는 이유를 알려주시겠습니까?
문제가 안된다면 select 를 사용하지 못하는 이유를 알려주시겠습니까?
냠
그런식으로 짤려고 시도하는 거 구조 자체가 별로 좋아보이지 않습니다... 원래 모든 signal은 한 프로세스 내에서 전역적으로 동작한다고 생각하고 짜야하거든요... 보통 솔라리스에선 signal을 부모 쓰레드(다른 넘들을 생성한 쓰레드)가 받습니다...리눅스의 경우는 누가 가장 먼저 받을지 모릅니다...(리눅스의 경우 real-time signal을 이용하면 어느정도 해결을 할 수 있지만, 쓰레드 풀링이 아닌경우는 좀 문제가 있죠...) 말하자면, 제어하기가 그만큼 힘들다는 거죠...하여튼, 어떤 걸 짜려고 하시는지는 모르겠지만, 다른 구조를 시도해 보시는게 좋을 거 같은데요....
Re: 스레드와 알람 시그널 (솔라리스)
제가 이해한 것이 맞는지 봐주세요.
일단, recv를 하는 스레드가 생성이 되고,
그 스레드에서 timeout을 설정하기 위해서 alarm을 사용한다는 말씀이죠?
맞다면 이렇게 하는 건 어떨가요..
타이머 쓰레드가 딱 하나 있어요.
그리고 각각의 recv 스레드들이 있구요.
각각의 recv용 스레드들이 실제로 recv를 하기 전에, 전역변수 하나를 토글 시켜 둡니다.
해당 전역변수는 어떤 스레드 인지를 구분하기 위해 사용하구요.
타이머 쓰레드는 각각의 스레드에 맞게 변수를 하나씩 갖게 되며
전역 변수를 확인 해서 recv상태로 간 스레드들을 위한 변수에 값을 1씩 계속 증가시켜 줍니다.
그러다가 지정된 값이 되었는데도 recv가 끝나지 않아 전역변수의 상태가 바뀌지 않은 것은 해당 스레드가 timeout되었다고 인지하고 처리..
음.. 배보다 배꼽이 더 큰거 같군요.
근데 구현하면 그리 많지는 않을 것 같네요.
다만, recv 스레드가 동적으로 (갯수의 제한을 두기 어려울때?) 생성될때에 대한 적절한 처리가 필요하겠지만, 이도 무시하고 약 만개 정도=0= 배열 만드러 두면 충분하겠죠 =0=;;;
참, 각각 recv 스레드는 각각의 id가 고유해야 하기 때문에, 메인 스레드에서
recv 스레드를 생성할때마다 id를 할당 해주어야 겠네요..
ticket 끊어 주듯이...
https://nicesj.com
https://blog.nicesj.com
댓글 달기