시그널 블록시키기

urmajest의 이미지

안녕하세요
저의 무지를 일깨워주세요 -_-

시그널 블록이란게무시하는게 아니라 나중에 시그널을 보내도록 하는건가요?

예를 들어 SIGUSR1, SIGUSR2, SIGTERM 시그널에 대해 child가 임의의 행

동을 하게 되는데..

아래와 같이 설정하는게 SIGUSR1, SIGUSR2의 핸들러가 실행되는 동안 다른

시그널 핸들러를 실행하지않고 기다리다가, 실행중인 핸들러 실행후에 시그널

을 받아서 처리하게 되나요?

        sigset_t mask;
        sigemptyset(&mask); 
        // child가 받는 3개의 시그널을 마스크
        sigaddset(&mask , SIGUSR1);
        sigaddset(&mask , SIGUSR2);
        sigaddset(&mask , SIGTERM);
        // 시그널 핸들러 정의
        struct sigaction actSIGUSR2, actSIGUSR1;
        actSIGUSR2.sa_handler = processOnTheRun;
        actSIGUSR2.sa_mask = mask;
        actSIGUSR2.sa_flags = 0;
        actSIGUSR1.sa_handler = processOutOfRun;
        actSIGUSR1.sa_mask = mask;
        actSIGUSR1.sa_flags = 0;
        sigaction(SIGUSR2, &actSIGUSR2, NULL);
        sigaction(SIGUSR1, &actSIGUSR1, NULL);
        // 시그널 블록
        sigprocmask(SIG_BLOCK, &mask, NULL);
        while(1)
                sigsuspend(&mask);

근데 이렇게 하니깐 시그널 헨들러 동작을

전혀 안 하네요 -_-

좋은 밤 되세요~

codebank의 이미지

마스크를 한다는건 자신이 받아들일 시그널에 대해서 세팅을 한다는 소리로
알고 있습니다. 즉, 내가 1번 시그널과 2번 시그널을 마스크한다는 소리는
1,2번 시그널이 발생했을때 프로그램에서 각 시그널이 들어왔을 때 해당하는
루틴을 실행하도록 만든다는 소리입니다.
시그널은 한번 발생해서 시스템내에서 사용되어지면 사라지는 것으로 알고
있습니다.
즉, 컴퓨터에서 time 시그널이 발생했을때 바로 그때만 유효할 뿐이고 이후에는
유효하지 않다는 소리와 같다고 들었습니다.
네트워크로 전달되는 값들은 자료가 저장될 따로의 버퍼가 있고 시그널 처리가
되어지지 않으면 일정시간 버퍼에 남아있다가 새로운 자료가 들어올 때에 밀려서
사라진다고 알고 있고요.(환형큐형태로 알고 있는데...)
시그널이 대기하는 경우는 없는걸로 알고 있습니다. 발생을하면 바로 그 시그널을
마스크한 프로세서에 전달을 해주기만 하고 시그널이 발생했던 과거 경력을 기록하
는 일은 안한다고 알고 있습니다.

아래는 시그널에 관련된 약간의 자료가 있는 사이트입니다.

http://www.badnom.com/document/bad/system5.txt

------------------------------
좋은 하루 되세요.

stoneshim의 이미지

signal mask는 해당 프로세스에 전달이 block 될 signal의 set 입니다.

signal이 block 된다는 의미는 해당 프로세스의 signal에 대한 action이 실행되지 않도록 pending 된다는 뜻이며, 해당 signal을 unblock 시키거나 해당 signal에 대한 action을 ignore로 변경하기 전까지 block 됩니다.

signal() 함수를 이용하면 signal이 한번 해당 signal의 action대로 수행되면 설정이 없어지지만 sigaction()을 사용하면 action이 계속 유지됩니다.

sigsuspend()는 signal mask 값을 변경하는 것과 sleep 을 atomic 하게 처리해 주는 시스템 콜입니다.

현재 소스에서는 sigprocmask()로 SIGUSR1, SIGUSR2, SIGTERM을 block 시켰으므로 해당 signal들이 발생했을때 action이 실행되지 않고 pending 됩니다.
sigsuspend()가 부적절해 보이는군요. sigpending()으로 검사해보고 필요시에 ignore로 변경하거나, 다시 sigprocmask()로 block을 해제하는것이 좋아보입니다.

자세한 내용은 man page를 참고하세요

우리 모두 리얼리스트가 되자. 그러나 가슴에 이룰 수 없는 꿈을 가지자

mushim의 이미지

아마 평상시에는 sleep 하고 있다가, 특정 signal 에 대해서 처리하고 다시 sleep 하는 프로그램을 작성할려는 하는 의도 같군요.

일단 sigsuspend() 의 용도를 오해하시는 것 같네요.

sigsuspend(mask) 는 기존 blocked signal 을 저장하고 mask 에 기록된 값으로 blocked signal 을 만든후 sleep 상태로 있게 됩니다.

그러다가 block 되지 않은 signal 에 대해서만 깨어나게 됩니다.

sigaddset(&mask , SIGUSR1);
sigaddset(&mask , SIGUSR2);
sigaddset(&mask , SIGTERM);

while(1)
  sigsuspend(&mask);

따라서 위의 코드는 잘못되었구요. 아래와 같이 사용하셔야 할것 같습니다.

sigfillset(&wake_mask);
sigdelset(&wake_mask , SIGUSR1); 
sigdelset(&wake_mask , SIGUSR2); 
sigdelset(&wake_mask , SIGTERM); 

while(1) 
  sigsuspend(&wake_mask); 

만약 while(1) 코드로 넘어가기 전까지의 코드를 특정 signal 에 대해서 block 하고 싶으시면 다음과 같이 sigprocmask 를 추가하셔도 상관없습니다.

sigprocmask(SIG_BLOCK, &mask, NULL); 
...
코드
...
while(1) 
  sigsuspend(&wake_mask); 

댓글 달기

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