프로그래밍/C2012. 1. 25. 18:34
signal 라이브러리 함수은 다음과 같다.

void (*signal(int sig, void (*func)(int)))(int);

예)
위에 예제처럼 printf를 시그널 핸들러 함수에서 하는건 안전하지 않다.
그보다는, 시그널 핸들러가 플래그를 set하고 메인 함수에서 flag를 체크해서 그에 맞게 처리하는게 좋다.

하지만 X/Open 및 UNIX specifications은 sigaction이라는 프로그래밍 인터페이스를 사용하기를 권장한다.

#include <signal.n>
int sigaction(int sig, const struct sigaction *act, struct sigaction *oact);

설명
sigaction structure는 다음의 멤버들을 가지고 있다.
    void (*) (int) sa_handler  /* 함수, SIG_DFL, SIG_IGN*/
    sigset_t sa_mask            /* sa_handler에서 블록할 signal*/
    int sa_flags                    /* signal action modifier*/

sigaction 함수는 시그널 sig와 연관된 action을 설정한다.
 - oact가 null이 아닌 경우, sigaction은 이전의 signal action을 쓴다.
 -- act가 null인 경우, 아무 일도 안한다.
 -- act가 null이 아닌 경우, 시그널을 위한 action이 설정된다.

act에 의해 가리켜지는 sigaction 안에 있는 sa_handler는 시그널 sig가 들어오면 불려지는 함수에 대한 포인터이다.
sa_mask는 sa_handler가 불리기 전에 프로세스의 시그널 mask에 추가될 시그널 세트들을 설정한다.(이 세트들은 블록되어 프로세스로 전달되지 않는 시그널들이다.  sa_mask를 사용하면 race condition을 방지할 수 있다)

Return value
sigaction이 성공적일 경우, 0을 리턴하고 아닌 경우 -1을 리턴한다. A

'프로그래밍 > C' 카테고리의 다른 글

enum 타입 c vs c++  (0) 2012.02.04
system vs exec  (0) 2012.01.30
error: invalide storage class for function 'xxxx'  (0) 2011.11.29
대상체의 기억수명  (0) 2011.11.29
열거, enum, 이놈  (0) 2011.11.28
Posted by code cat