쓰레드와 시그널 문제

sysadmin의 이미지

안녕하십니까?
쓰레드쪽을 공부하다 보니까 한가지 궁금한 것이 있어서요...

멀티 쓰레드를 이용해서 서버 프로그램을 만들려고 합니다..
Client의 요청을 기다리고 있다가(accept()) 연결되면
새로운 쓰레드를 하나 생성해서 그 Client와 데이타를 주고 받으면서 서비스를 하고 더 이상 서비스할게 없으면 죽는 식이죠...

문제는 예를 들어 10개의 Client가 현재 서비스되고 있는 상황에서
(당연히 Main서버를 제외하고 10개의 쓰레드가 떠 있는 상태겠죠..)
임의의 Client가 강제로 connection을 끊는 경우 SIGPIPE 시그널이
서버쪽에 전해질텐데 그건 해당 쓰레드가 받게 되는건지
아니면 해당 프로세스가 받게되는건지가 궁금하네요...
(쓰레드별로 동일한 pid인 경우와 별개의 pid인 경우 모두 궁금.)

만약 해당 쓰레드가 받게 된다면 shell 상에서 특정쓰레드에게 시그널을
보내는 명령어가 있는지도 궁금하구요..
반대로 프로세스가 받게 된다면 어떤 쓰레드의 연결이 끊어진 건지를 어떻게
알 수 있는지...(연결이 끊어진 상태인지 아닌지를 각각의
스레드에서 계속 체크를 해야하느지...)

글구 보통 멀티쓰레드 서버들은 위의 문제를 어떻게 구현하죠?

여러 고수님들의 답변 부탁드립니다...

sunyzero의 이미지

signal handler는 sigaction으로 주고, 매스킹은 pthread_sigmask 를 사용하시고, 특정 쓰레드에 시그널을 줄려면 pthread_kill 을 쓰시면 됩니다.

========================================
* The truth will set you free.

shkwon81의 이미지

아래 링크를 참고하세요.. 예전에 뉴스 그룹에 포스팅했던 글입니다.

http://groups.google.co.kr/groups?hl=ko&lr=&ie=UTF-8&inlang=ko&newwindow=1&th=71b56c79ab47cbb2&rnum=1

sysadmin의 이미지

답변 정말 감사합니다..

결론적으로 프로세스 외부에서는 특정 쓰레드에게만 시그널을 보낼 수는
없다는 말씀이시네요..

천상 소켓으로 입/출력을 하기 전에 한번더 체크하는 방법밖에 없겠네요..
(맞나??)

shkwon81님 책 빨리 만들어주세요~~~ ^^

shkwon81의 이미지

Quote:
문제는 예를 들어 10개의 Client가 현재 서비스되고 있는 상황에서
(당연히 Main서버를 제외하고 10개의 쓰레드가 떠 있는 상태겠죠..)
임의의 Client가 강제로 connection을 끊는 경우 SIGPIPE 시그널이
서버쪽에 전해질텐데 그건 해당 쓰레드가 받게 되는건지
아니면 해당 프로세스가 받게되는건지가 궁금하네요...
(쓰레드별로 동일한 pid인 경우와 별개의 pid인 경우 모두 궁금.)

서버 ------ 클라이언트 <- 이런 상태로 연결이 되어 있다면..

클라이언트에서 소켓을 끊었다고 해서 서버에 SIGPIPE가 전달되는 것은 아닙니다. SIGPIPE는 상대방이 닫은 fd로 쓰기를 하려는 순간에 발생합니다.

제 생각에는 "명시적으로 쓰기를 수행한 쓰레드"로만 SIGPIPE가 전달될 것 같습니다.

참고로, 모든 시그널이 임의의 쓰레드로 전달되는 것은 아닙니다.
SIGFPE (부동 소수점 연산 오류), SIGSEGV (메모리 접근 오류) 등과 같이 명백하게 시그널을 발생시킨 쓰레드가 정해져 있는 경우는 해당 쓰레드에게 시그널이 전달됩니다. 이런 시그널을 synchronous signal 이라고 하는데, SIGPIPE도 이 범주에 들지 않을까 합니다.

이 정도로 밖에는 말을 못 해 드리겠네요..

sysadmin의 이미지

정말정말 감사합니다..
많이 도움이 됐습니다...

천상 한번 테스트를 해봐야겠네요.. ^^

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.