스레드와 알람 시그널 (솔라리스)

pjs0722의 이미지

안녕하십니까!!

통신프로그램을 짜고 있는데.... 시그널 처리 때문에 질문을 드립니다.

일단 구조를 말씀 드리면

메인에서 스레드 하나를 호출하여

이 스레드에서 accept()를 합니다..

클라이언트가 접속하면 accept() 를 실행하는 스레드에서

스레드를 호출하여 클라이언트와 연결시킵니다...

이런 후 recv() 를 할때 알람시그널을 이용하여 timeout를 체크합니다.

(왜? select()를 안쓰고 시그널을 쓰냐는 분들이 계실지 몰라 미리 말씀드리는데

사정상 select()는 사용하기가 좀 곤란합니다)

recv() 시 알람시그널을 사용하여 timeout를 체크하면 솔라리스 상에서

해당 스레드에서 이 시그널을 받지 못합니다.

제가 확인 결과 accept() 를 실해하는 스레드로 전달이 되는것 같습니다.

이 알람시그널을 해당 스레드에서 받을 수 있게 하려면 어떻게 해야 할까요?

답변부탁드립니다 .... !! :D

하하의 이미지

좀 힘들지 않을까요?

listen 과 accept 할 쓰레드에서

알람 시그널을 마스크로 막는다 하여도

실제 클라이언트와 통신 할 쓰레드에서만

시그 알람을 받게 한다면 ...

통신 쓰레드가 여러개 있을 땐 각각의 쓰레드간

어디로 시그날이 갈지 몰라 처리하기 힘들지 않을까요?

ㅋ..

“바람에게도 길은 있다. 나는 비로소 나의 길을 가느니. 길은 언제나 어디에나 있다.”

sjpark의 이미지

전역변수로 시그널 개념이 필요한 스레드 갯수만큼 배열 하나 만들어 놓고,

특정 엔트리당 특정 스레드로, 영역 충돌 안생기게 고정시켜 놓고,

이벤트가 발생하면 해당 배열의 index를 toggle 시키면

스레드는 저 배열 index를 polling하고 있다가 toggle되면 실행하는..
이런건 안될까요?

가끔 저렇게 프로그래밍 할 때도 있었거든요..흠흠..

pjs0722의 이미지

이벤트가 발생하면 해당 배열의 index를 toggle 시키면

----------------------------------------------------------------------------------

이벤트가 발생하면 이라고 하셨는데 이벤트(즉, 알람시그널)이 되겠지요

그러면 이 이벤트가 어느 스레드의 이벤트인지를 어떻게 알 수 있을까요..?

그리고 해당 스레드에서 toggle 된 것을 모니터링하기 위한 작업을 추가해야

한다는 것인데 ...... 음 .....

현 상황은 스레드가 recv() 하고 있는 상황입니다. 여기서 timeout 를 체크하기

위한 방법을 생각 중이고요 .... 음 ....

^^;

:lol:

대박나세요~

bugiii의 이미지

솔라리스에 SO_RCVTIMEO 옵션이 있는지 알아봐주시겠습니까?

pjs0722의 이미지

bugiii wrote:
솔라리스에 SO_RCVTIMEO 옵션이 있는지 알아봐주시겠습니까?

------------------------------------------------------------------------------------

제가 테스트해본 봐로는 솔라리스 6 , 7 (32, 64 bit) 그리고 HP UX 10, 11

모두 SO_RCVTIMEO 옵션이 먹질 않더군요 .... ㅠ.ㅠ!!

대박나세요~

bugiii의 이미지

문제가 안된다면 select 를 사용하지 못하는 이유를 알려주시겠습니까?

honestee의 이미지

그런식으로 짤려고 시도하는 거 구조 자체가 별로 좋아보이지 않습니다... 원래 모든 signal은 한 프로세스 내에서 전역적으로 동작한다고 생각하고 짜야하거든요... 보통 솔라리스에선 signal을 부모 쓰레드(다른 넘들을 생성한 쓰레드)가 받습니다...리눅스의 경우는 누가 가장 먼저 받을지 모릅니다...(리눅스의 경우 real-time signal을 이용하면 어느정도 해결을 할 수 있지만, 쓰레드 풀링이 아닌경우는 좀 문제가 있죠...) 말하자면, 제어하기가 그만큼 힘들다는 거죠...하여튼, 어떤 걸 짜려고 하시는지는 모르겠지만, 다른 구조를 시도해 보시는게 좋을 거 같은데요....

sjpark의 이미지

pjs0722 wrote:
안녕하십니까!!

통신프로그램을 짜고 있는데.... 시그널 처리 때문에 질문을 드립니다.

일단 구조를 말씀 드리면

메인에서 스레드 하나를 호출하여

이 스레드에서 accept()를 합니다..

클라이언트가 접속하면 accept() 를 실행하는 스레드에서

스레드를 호출하여 클라이언트와 연결시킵니다...

이런 후 recv() 를 할때 알람시그널을 이용하여 timeout를 체크합니다.

(왜? select()를 안쓰고 시그널을 쓰냐는 분들이 계실지 몰라 미리 말씀드리는데

사정상 select()는 사용하기가 좀 곤란합니다)

recv() 시 알람시그널을 사용하여 timeout를 체크하면 솔라리스 상에서

해당 스레드에서 이 시그널을 받지 못합니다.

제가 확인 결과 accept() 를 실해하는 스레드로 전달이 되는것 같습니다.

이 알람시그널을 해당 스레드에서 받을 수 있게 하려면 어떻게 해야 할까요?

답변부탁드립니다 .... !! :D

제가 이해한 것이 맞는지 봐주세요.

일단, recv를 하는 스레드가 생성이 되고,
그 스레드에서 timeout을 설정하기 위해서 alarm을 사용한다는 말씀이죠?

맞다면 이렇게 하는 건 어떨가요..

타이머 쓰레드가 딱 하나 있어요.

그리고 각각의 recv 스레드들이 있구요.

각각의 recv용 스레드들이 실제로 recv를 하기 전에, 전역변수 하나를 토글 시켜 둡니다.

해당 전역변수는 어떤 스레드 인지를 구분하기 위해 사용하구요.

타이머 쓰레드는 각각의 스레드에 맞게 변수를 하나씩 갖게 되며

전역 변수를 확인 해서 recv상태로 간 스레드들을 위한 변수에 값을 1씩 계속 증가시켜 줍니다.

그러다가 지정된 값이 되었는데도 recv가 끝나지 않아 전역변수의 상태가 바뀌지 않은 것은 해당 스레드가 timeout되었다고 인지하고 처리..

음.. 배보다 배꼽이 더 큰거 같군요.
근데 구현하면 그리 많지는 않을 것 같네요.

다만, recv 스레드가 동적으로 (갯수의 제한을 두기 어려울때?) 생성될때에 대한 적절한 처리가 필요하겠지만, 이도 무시하고 약 만개 정도=0= 배열 만드러 두면 충분하겠죠 =0=;;;

참, 각각 recv 스레드는 각각의 id가 고유해야 하기 때문에, 메인 스레드에서
recv 스레드를 생성할때마다 id를 할당 해주어야 겠네요..

ticket 끊어 주듯이...

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.