시그널관련 질문입니다.

dummy999의 이미지

1  #include<stdio.h>
2  #include<sys/wait.h> //WEXITSTATUS()
3  #include<sys/signal.h>
4  void myprog(int);
5  main()
6  { 
7     int i,pid,stat;
8     signal(SIGCHLD, myprog);
9     signal(SIGINT, myprog);
10    signal(SIGQUIT, myprog); 
11    for (i=0; i<10 ;i++)
12    {
13		if (fork() == 0)
14		{
15	    	//sleep(i+1);
16	    	exit(i+1);
17	  	}
18    }
19    while(1)
20    	pause();//시그널올때까지 대기. 
21 }
22
23 void myprog(int signal) 
24 {
25    int pid, stat,who;
26    pid =wait(&stat); 
27    printf("-------------------------------------------\n");
28    printf("신호감지. 신호번호=%d, pid =%d 종료코드 =%d\n",signal,pid,WEXITSTATUS(stat));
29    if(WIFEXITED(stat)) /*자식이 정상적으로 종료되었다면 non-zero 이다. */ 
30	    printf("정상종료 "); /* 일반종료 */ 
31    else
32        printf("비정상종료 "); 
33    if((WIFSIGNALED(stat)))
34        printf("외부의 %d가 자식죽임 ",WTERMSIG(stat));
35    else
36        printf("내부종료 "); // 거짓이면.
37    printf("\n");
38 }

Q. 위의 코드32라인의 외부에서 죽이는경우는 언제인가요?

Q. 어떻게 죽었는지 알수있고 누가죽였는지도 알수있는 플그램을 작성하려합니다.
예컨데 TTY2에서 죽이면 거기서 죽었다라고 하고싶습니다.
제가 시그널처리쪽은 잘모릅니다. 그래서 다소 질문이 허접하고 실망스럽겠지만.
공부하고있으니 잘좀부탁드립니다.

-----------------------------------------------------------------

이하는 제가 작업해본 실행화면들인데 이런상황에대해 설명을 부탁드립니다.

상황1. :: TTY1(터미널1)에서 실행하고 TTY2(다른터미널)에서 시그널을 주고있음

<<tty1>>
> ./zb_2 
signal detecting.. number 17, pid =18347 
signal detecting.. number 17, pid =18351 
signal detecting.. number 17, pid =18352 
signal detecting.. number 17, pid =18353 

Q. 10 개를 생성했는데도 ps할때 10개의 좀비프로세스가 안만들어지는 이유를 알고싶습니다.

<<tty2>>
> ps -lu dummy999
  F S   UID   PID  PPID  C PRI  NI ADDR SZ WCHAN  TTY          TIME CMD
100 S  2060 17303 17302  0  69   0 -   881 wait4  pts/1    00:00:00 bash
100 S  2060 17342 17341  0  74   0 -   856 wait4  pts/2    00:00:00 bash
000 S  2060 18343 17303  0  68   0 -   309 pause  pts/1    00:00:00 zb_2
044 Z  2060 18344 18343  0  69   0 -     0 exit   pts/1    00:00:00 zb_2 <defunc
044 Z  2060 18345 18343  0  70   0 -     0 exit   pts/1    00:00:00 zb_2 <defunc
044 Z  2060 18346 18343  0  70   0 -     0 exit   pts/1    00:00:00 zb_2 <defunc
044 Z  2060 18348 18343  0  70   0 -     0 exit   pts/1    00:00:00 zb_2 <defunc
044 Z  2060 18349 18343  0  71   0 -     0 exit   pts/1    00:00:00 zb_2 <defunc
044 Z  2060 18350 18343  0  71   0 -     0 exit   pts/1    00:00:00 zb_2 <defunc
000 R  2060 18356 17342  0  79   0 -   828 -      pts/2    00:00:00 ps
> 

상황2. ::

<<tty1>>
> ./a.out
-------------------------------------------
신호감지. 번호=17, pid =18425 종료코드 =5
정상종료 내부종료 

-------------------------------------------
신호감지. 번호=17, pid =18422 종료코드 =5
정상종료 내부종료 

-------------------------------------------
신호감지. 번호=17, pid =18416 종료코드 =5
정상종료 내부종료 

-------------------------------------------
신호감지. 번호=17, pid =18417 종료코드 =5
정상종료 내부종료 

-------------------------------------------
신호감지. 번호=17, pid =18418 종료코드 =5
정상종료 내부종료 

-------------------------------------------
신호감지. 번호=17, pid =18413 종료코드 =5
정상종료 내부종료 

-------------------------------------------
신호감지. 번호=17, pid =18419 종료코드 =5
정상종료 내부종료 

-------------------------------------------
신호감지. 번호=17, pid =18415 종료코드 =5
정상종료 내부종료 

-------------------------------------------
신호감지. 번호=17, pid =18420 종료코드 =5
정상종료 내부종료 

-------------------------------------------
신호감지. 번호=17, pid =18423 종료코드 =5
정상종료 내부종료 

-------------------------------------------
신호감지. 번호=17, pid =18429 종료코드 =9
정상종료 내부종료 

Q. 반복해서 발생하는 이유와 종료코드의 의미.
(제가 생각하는게 맞는지 검증부탁드립니다.)
제가 알기로는 큐가 하나인데 그거도 비트만 담는 큐라서 동시에 발생하면
이것을 하나하나씩 처리를 못하기때문에 좀비프로세서가 생긴다고 합니다.
하나 처리하는데 일정시간이 드는데 그것을 처리하기도전에 또 나오면 뒤에나오는것은
처리를 못한다고 합니다.

------------------------------<< 추가내용 >> ------------------------------
참고로 이건 학교 수업내용의 일부입니다. 밑에 글써주신분에게 정말 감사를드리지만. 제가 학교수업내용이라는말을 안써놔서리.. 정말 죄송하게되었습니다.

pynoos의 이미지

시그널을 공부하시려면, 전통적인 시그널들이 주로 어떤 상황에서 나오는지 아셔야합니다. 시그널을 공부하기에 좋은 등록함수는 signal 보다는 sigaction 입니다.

예를 들면, SIGCHLD 는 child process가 죽었을경우에만 올라오는 것으로 알고 있는데, 사실은 다른 변화에서도 올라옵니다.

man sigaction

       +--------------------------------------------+
       |                  SIGCHLD                   |
       +--------------+-----------------------------+
       |CLD_EXITED    | child has exited            |
       +--------------+-----------------------------+
       |CLD_KILLED    | child was killed            |
       +--------------+-----------------------------+
       |CLD_DUMPED    | child terminated abnormally |
       +--------------+-----------------------------+
       |CLD_TRAPPED   | traced child has trapped    |
       +--------------+-----------------------------+
       |CLD_STOPPED   | child has stopped           |
       +--------------+-----------------------------+
       |CLD_CONTINUED | stopped child has continued |
       +--------------+-----------------------------+

간단히 보더래도 종료되었는지, 죽었는지, stopped 상태로 바뀌었는지 또는 재개하였는지.. 이런 상세한 것은

sigaction 구조체중 sa_sigaction에 등록할 수 있는 callback 함수타잎의 두번때 인자를 통해서 알게 되는데, 그것은 시그널 마다 다르게 되고
시그널하나하나를 찬찬히 보게 되어야 알 수 있습니다.

sigaction이 UNIX의 최근에 들어온 개념이라, 전통적인 몇몇 구현에서는 아직 안들어온것이 있습니다만, signal을 대체해가는 함수로 자주 사용되고 있습니다.

댓글 달기

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