TCPIP

2013.07.02_sigaction() 함수.

성엽이 2013. 7. 2. 15:58


 Signals(신호)

 하드웨어적 인터럽트 : ARM, ATmega .. MCU 칩 .. 등등

 소프트웨어적 인터럽트 : 

 리눅스 : Signal (신호)

 윈도우 : Message (메세지)

 자바    : Event (이벤트) 

 위의 S/W 인터럽트중 Signal이 수행이 될때, 다음의 4가지중에 하나가 동작한다.

 1. 신호가 무시된다. 프로세스는 전달되었다는 것을 인식못함.

 2. 프로그램이 운영체제에 의해 강제적으로 종료됨.

 3. 프로그램에 의해 지정된 신호 처리 루틴(signal-handling routine)이 수행.

 4. 신호가 블록된다. 각 프로세스는 마스크(mask)를 가지며, 이것은 현재 해당되는 프로세스에 어떤신호가 블록되어있는지 나타낸다.


 우린 보통 1, 3의 경우를 많이 본다.




sigaction() 함수


int sigaction(int whichSignal, const struct sigaction *newAction, struct sigaction *oldAction)


 


  1. 구조체 안의 sa_handler 는 함수포인터로 함수의 주소를 가져올 수 있고, 반환형은 void 인자는 int 이다.

  2. sa_mask 는 4가지의 함수로 조작할 수 있다.

    - int sigemptyset(sigset_t *set) 

    - int sigfillset(sigset_t *set)

    - int sigaddset(sigset_t *set)

    - int sigdelset(sigset_t *set)


<sa_mask의 신호형태 설정>



 테스트 소스

#include<stdio.h>

#include<signal.h>


void SMART(int );

int main()

{

struct sigaction st_Act;

st_Act.sa_handler = SMART;

sigfillset(&st_Act.sa_mask);

st_Act.sa_flags = 0;


sigaction(SIGINT,&st_Act,0);


        while(1)

        {

                 printf("안녕하세요 'Q' 를 누르면 종료합니다.\n");

                 if('q' == getchar())

                 {

                        break;

                 }

        }

        return 0;

}


// 직접 SIGINT 를 넣어서 Ctrl+C 의 명령어를 지정해주었다. 글자가 출력되면서 꺼짐.

void SMART(int sig)

{  

      printf("Ctrl + C가 눌러졌습니다\n");

      exit(0);

}