[signal 질문] signal 질문입니다.

kjw7945의 이미지

1   #include <signal.h>
2   #include <unistd.h>
3
4   void sig_handler(int signo);
5
6   int main()
7   {
8        int i = 0;
9        printf("Program start\n");
10
11       if ( signal(SIGHUP, (void *)sig_handler ) == SIG_ERR )
12        {
13                  perror("signal set error : ");
14                  exit(0);
15        }
16
17        while(1)
18        {
19                   printf("%d\n", i);
20                   i++;
21                   sleep(1);
22        }
23
24         return 1;
25   }
26
27   void sig_handler(int signo)
28   {
29         execl("./sig_hp", 0);
30   }

1.
위의 코드를 컴파일 한 후 실행 후에 SIGHUP 발생하면
한번은 잘 실행됩니다. 그런데 제가 잘 모르는 부분은
어째서 시그널을 인식하고 잘 실행이 되는가 입니다.

첫 시작은
1, 2, 3, 4, 5 숫자가 계속 증가하면서 화면에 찍습니다.
17 ~ 22번 라인이 계속 실행 되는 거죠. 그러다 kill 명령어
시그널을 주면 다시 프로그램이 실행 됩니다. 근데 궁금한
것이 17~22번 라인이 실행되고 있는데 어째서 시그널을
발생시키면 11번 라인이 실행 되는지 궁금합니다.
C언어는 인터프린터 언어인데..... 어떻게 위의 11번
라인에 걸려서 실행이 되는지 궁금합니다.

2.
위의 코드를 컴파일 한후
kill 명령어를 이용해서 SIGHUP 발생시키면
다시 실행 됩니다.
그런데 다시 한번 또 실행시키면 다시 실행이 안되네요.
그 이유를 잘 몰르겠습니다.

kslee80의 이미지

C 는 인터프리터 언어가 아닙니다. :)

1. 시그널에 대해서 조금 더 자세하게 알아보셔야 할것 같군요.

실행하고 나서 SIGHUP 을 발생시켰을때,
프로그램의 실행이 11번 라인으로 되돌아 가는것이 아닙니다.
11번 라인의 signal() 함수 콜은
"이 프로세스에게 SIGHUP 시그널이 온다면 sig_handler 라는 함수를 실행하라"
라고 커널에 알려주는 역할입니다.
이 이후 SIGHUP 이 프로세스에게 전달되면,
커널은 프로그램의 수행을 sig_handler 라는 함수로 "임시로" 옮깁니다.
sig_handler 의 수행이 끝나면 다시 시그널을 받은 위치로 돌아와서 계속 수행하죠.

사실, 이 signal 처리에 대한 부분은 C 언어에서 다루는 부분이 아닙니다.
순수하게 OS 의존적인 부분이죠.

2. signal handler 가 정상적으로 종료되지 않았기 때문으로 보입니다.
signal handler 에서 현재 프로세스 내용을 바꿔 버렸습니다(exec() 콜)
즉, SIGHUP signal 에 대한 처리가 끝나지 않은 상태로 프로세스가 수행중이기 때문에
더이상 SIGHUP 에 대한 signal handler 수행을 하지 못하는 상태가 됩니다.

익명 사용자의 이미지

답변 감사합니다. ^^

댓글 달기

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