멀티쓰레드 기반하의 signal 정보

pizza1977의 이미지

sigaction 함수를 사용하여 si_pid를 확인하려 했습니다만
kill(sigterm) 또는 SIGCHLD 에서만 si_pid를 셋팅하는 것 같습니다.
제가 잡고 싶은건 SIGSEGV인데...샘플로 돌려봐도 SIGSEGV를 발생시키면 si_pid는 그냥 '0'이 더군요.

마지막으로 signalHandler 함수 내에 getpid() 함수를 넣어 봤더니 예상외로 SIGSEGV를 보낸 쓰레드의 pid를 찍었습니다.

문제는 signal을 받고 처리하는 중간에 너무 많은 시그날을 받는 다는 것입니다. 처리는 받아서 로그를 생성하고 종료하는 것인데 그 중간에 같은 로그메시지가 너무 많아 디버깅이 힘들정도 입니다.

시그널 핸들러는 signal을 이용하여 등록하였는데(sigaction은 사용하지 않았습니다.) 이 때 중복된 시그널을 막을 수 있는 방법이 무엇인지 궁금합니다.

lbsg98의 이미지

sunOS에서의 사용.

--> signal(SIGSEGV, SigCore);

void SigCode(int signo)
{
     signal(SIGSEGV, SIG_IGN);
     주절...
     주절...
     signal(SIGSEGV, SigCore);
}

위의 방법으로 하시면 일시적으로 시그널을 무시하게 됩니다.
또한 아주 짧은 시간 즉 signal함수를 불러서
"signal(SIGSEGV, SIG_IGN);" call하는 그 순간에 signal이 불려지게 되면 (멀티 스레드 프로그램시 가끔 발생함.) 프로그램은 그어떤 정보도 남기지 않고 죽게 됩니다.
그레서 그러한 순간까지도 잡을려면 sunOS에서는 sigset을 사용하면 됩니다. 리눅스에서는 없어서 직접 sigset을 만들어 사용 해야 합니다.

이것은 제가 리눅스용으로 만들어 사용하던겁니다.
참고하시기 바랍니다. 그리고 이문제는 예전에 제가
여기 올린 다른것이 있을겁니다 한번 찾아보시기를....

/*-------------------------------------------------------------------------
 * 함 수 명 : hssigset
 * 기    능 : signal setting function
 * 매개변수 : int sig, void (*func)(int sig)
 * return   : void (*func)
 * KeyWord  : hssigset
 * 주의사항 :
---------------------------------------------------------------------------*/
void (*hssigset(int sig, void (*func)(int sig)))(int)
{
    struct sigaction si, so;
    memset(&si, 0x00, sizeof(si));
    memset(&so, 0x00, sizeof(so));
    si.sa_handler = func;
    si.sa_flags = SA_RESTART;
    if(sigaction(sig, &si, &so) < 0) {
        LOGPRN(BL(BERR|1), "hssigset, error [%d][%s]", errno, GetErrTxt(errno));
        return(NULL);
    }
    return(so.sa_handler);
}
익명 사용자의 이미지

* 중복된 시그널을 막을 수는없고 버릴 수(까먹을 수) 는 있습니다.
* signal()은 시그널을(받는 측에서) 까먹을 수 도 있습니다.
* 그래서, sigaction을 사용하세요.

* 또한, 특정 프로세스가 멀티쓰레드로 구성된 환경에서 해당 프로세스 내의 쓰레드간 시그널을 주고 받을 수 있으나, 다른 프로세스에서는 특정 프로세스의 특정 쓰레드로 시그널을 줄 수 있는 방법은 기본적으로 없습니다.(만들어 씁시다)

익명 사용자의 이미지

답변 감사드립니다.

kimsk99의 이미지

멀티 쓰레드 프로그램에 시그날을 보낼때 어떤 쓰레드가 시그날에 반응하는 지는 OS에 따라서 심지어는 OS 버젼에 따라서 달라집니다.
구체적으로는 기억이 나지 않지만 솔라리스 8과 9이 다릅니다.
(9부터는 POSIX 표준을 따른다고 했던것으로 기억합니다.)
하여간 잘 확인하고 쓰세요.

댓글 달기

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 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.