signal 처리에 관한 질문입니다.

kkjin32의 이미지

어플리케이션 개발중 signal에 관한 질문 올립니다.

Database insert중에는 sinal을 SIG_IGN으로 무시 해버리고 있습니다.
그런후에 insert가 끝나면 다시 signal()로 signal을 받도록 했습니다.

그런데 무시한 signal중 일부는 꼭 받아야 하는 signal인 경우에 그 signal을 다시 받거나, 잠시 미루어 두었다가 처리하는 방법이 없을까요?

signal을 보내는쪽에서 signal을 보내지 말아야하는 시점을 알아내는 방법은 없을까요?

답변 부탁드립니다.
감사합니다.

서지훈의 이미지

시그널을 시점을 지정하는 건 잘 모르겠지만...
일단 시그널을 받으면 받은 시그널은 check해 두었다가 하고자 하는 작업이 끝난 후에 check된 시그널들을 따로 처리하는 방식으로 하는 방법도 한 번 생각을 해볼 수도 있을것 같네요.

<어떠한 역경에도 굴하지 않는 '하양 지훈'>

#include <com.h> <C2H5OH.h> <woman.h>
do { if (com) hacking(); if (money) drinking(); if (women) loving(); } while (1);

jongi의 이미지

시그널을 보내는 시점을 알아내는 방법을 구현하는 것 보다는, 다른 방법으로 처리하는게 좋지 않을까요?

어떤 어플리케이션인지 모르겠지만, 다른 프로세스로부터 중요한 이벤트를 받는 것이라면, 다른 방식(IPC나 소켓.. 등등)으로 구현하는게 나을 것 같습니다.

--
종이한장 * 이성으로 비관하더라도 의지로 낙관하라! (그람시)

pynoos의 이미지

signal 명령은 단지 시그널이 들어 왔을 때 호출되는 핸들러를 지정할 뿐입니다.
요새 깔끔한 프로그램은 그것보다는 sigaction을 사용하고,

kkjin32님께서 원하시는 것은 핸들러 지정으로 해결될 문제가 아니고, 잠시 시그널을 멈췄다가 재개하는 방법을 사용하셔야합니다.

#include <unistd.h>
#include <stdio.h>
#include <signal.h>

void func( int sig )
{
        printf("hi.. %d\n", sig);
}

int main()
{
        struct sigaction sa;
        sigset_t ss;

        if( fork() > 0 )
                exit(0);
        memset( &sa, 0, sizeof sa );

        sa.sa_handler = func;
        sigaction( SIGUSR1, & sa, 0 );

        sigemptyset( & ss );
        sigaddset( & ss, SIGUSR1 );

        sigprocmask( SIG_BLOCK, & ss, 0 );
        printf("do it now!\n" );
        printf("kill -SIGUSR1 %d\n", getpid() );

        printf("Sleeping 10 sec..\n" );
        sleep(10);
        printf("Unblocking..\n" );
        printf("Sleeping 10 sec..\n" );
        sigprocmask( SIG_UNBLOCK, &ss, 0 );

        sleep(10);
        return 0;
}

참고하세요.
위의 코드는, 10초간 쉬는 동안 SIGUSR1을 보내어도 반응하지 않다가 10초가 끝난 직후 그동안 SIGUSR1이 들어 왔을 경우 바로 시그널 처리를 하는 예제입니다.

jongi의 이미지

pynoos wrote:
참고하세요.
위의 코드는, 10초간 쉬는 동안 SIGUSR1을 보내어도 반응하지 않다가 10초가 끝난 직후 그동안 SIGUSR1이 들어 왔을 경우 바로 시그널 처리를 하는 예제입니다.

블러킹중에 같은 시그널이 여러번 발생할 경우엔 한번 밖에 처리하지 못하기 때문에 개인적으론 반드시 처리해야 하는 이벤트라면 시그널 방식은 꺼리는 편입니다. ^^

--
종이한장 * 이성으로 비관하더라도 의지로 낙관하라! (그람시)

pynoos의 이미지

그렇죠.. 저런 문제가 있습니다. 간과해서는 안되는 문제이지요.
시그널이 중요한 메시지를 주고 받는 수단이 되어서는 안됩니다.

shamlock의 이미지

매우 늦게 답변을 올립니다 ㅎㅎ.. 심심해서..
블러킹된 횟수도 알수 있습니다.

운영체제마다 지원하지 않을수도 있지만..
솔라리스와 리눅스에서는 되던데요..

@.@

댓글 달기

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