int sigaction(int signum, const struct sigaction *act, struct sigaction *oldact);
int sigprocmask(int how, const sigset_t *set, sigset_t *oldset);
int sigpending(sigset_t *set);
int sigsuspend(const sigset_t *mask);
signum 는 시그널을 명시하고, SIGKILL 그리고 SIGSTOP을제외하고는타당한시그널이될수있다.
만일 act 이 -null이 아니라면 시그널.I signum에 대한 새로운 액션은 .IR act에서 설치된다. 만일 oldact 이 -null이 아니라면, 이전의 액션은 .IR oldact에 저장된다.
sigaction 구조는 다음과 같이 정의된다.
struct sigaction {
void (*sa_handler)(int);
void (*sa_sigaction)(int, siginfo_t *, void *);
sigset_t sa_mask;
int sa_flags;
void (*sa_restorer)(void);
}
sa_restorer 요소는 안 쓰이는 것이어서, 사용되어서는 안된다. POSIX는 .I sa_restorer요소를 명시할 수 없다.
sa_handler 는 .I signum와 관련된 액션을 명시하고, 디폴트 액션에 대해 이 시그널을 무시하기 위한 SIG_DFL 또는 SIG_IGN 이거나, 시그널 처리 함수에 대한 지시자가 될 수 있다.
sa_mask gives a mask of signals which should be blocked during execution of the signal handler. In addition, the signal which triggered the handler will be blocked, unless the 는 시그널 처리기의 실행 동안 블록화되어야 하는 시그널의 마스크를 제공한다. 게다가, .B SA_NODEFER 또는 SA_NOMASK이 사용되지 않으면, 핸들러를 시동시키는 시그널은 블록화된다.
sa_flags 는 시그널 처리 프로세스의 행위를 수정하는 일련의 플래그들을 명시한다. 이는 bitwise 혹은 zero 혹은 다음 중 그 이상의 것들에 의해 형성된다.
sa_sigaction에 대한 .I siginfo_t 변수는 다음의 요소들을 지닌 구조체(struct)이다.
int si_errno; /* errno 값 */
int si_code; /* 시그널 코드 */
pid_t si_pid; /* 프로세스 ID 보내기 */
uid_t si_uid; /* 프로세스를 전송하는 실제 사용자 ID */
int si_status; /* Exit 값 또는 시그널 */
clock_t si_utime; /* 소모된 사용자 시간 */
clock_t si_stime; /* 소모된 시스템 시간 */
sigval_t si_value; /* 시그널 값 */
int si_int; /* POSIX.1b 시그널 */
void * si_ptr; /* POSIX.1b 시그널 */
void * si_addr; /* 실패를 초래한 메모리 위치 */
int si_band; /* 밴드 이벤트 */
int si_fd; /* 파일 기술자 */
}
| si_code | |||
| Value:Signal origin | |||
| SI_USER:kill, sigsend or raise | |||
| SI_KERNEL:The kernel | |||
| SI_QUEUE:sigqueue | |||
| SI_TIMER:timer expired | |||
| SI_MESGQ:mesq state changed | |||
| SI_ASYNCIO:AIO completed | |||
| SI_SIGIO:queued SIGIO | |||
| SIGILL | |||
| ILL_ILLOPC:illegal opcode | |||
| ILL_ILLOPN:illegal operand | |||
| ILL_ILLADR:illegal addressing mode | |||
| ILL_ILLTRP:illegal trap | |||
| ILL_PRVOPC:privileged opcode | |||
| ILL_PRVREG:privileged register | |||
| ILL_COPROC:coprocessor error | |||
| ILL_BADSTK:internal stack error | |||
| SIGFPE | |||
| FPE_INTDIV:integer divide by zero | |||
| FPE_INTOVF:integer overflow | |||
| FPE_FLTDIV:floating point divide by zero | |||
| FPE_FLTOVF:floating point overflow | |||
| FPE_FLTUND:floating point underflow | |||
| FPE_FLTRES:floating point inexact result | |||
| FPE_FLTINV:floating point invalid operation | |||
| FPE_FLTSUB:subscript out of range | |||
| SIGSEGV | |||
| SEGV_MAPERR:address not mapped to object | |||
| SEGV_ACCERR:invalid permissions for mapped object | |||
| SIGBUS | |||
| BUS_ADRALN:invalid address alignment | |||
| BUS_ADRERR:non-existant physical address | |||
| BUS_OBJERR:object specific hardware error | |||
| SIGTRAP | |||
| TRAP_BRKPT:process breakpoint | |||
| TRAP_TRACE:process trace trap | |||
| 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 | |||
| SIGPOLL | |||
| POLL_IN:data input available | |||
| POLL_OUT:output buffers available | |||
| POLL_MSG:input message available | |||
| POLL_ERR:i/o error | |||
| POLL_PRI:high priority input available | |||
| POLL_HUP:device disconnected | |||
sigprocmask 호출은 현재 블록화된 시그널들을 변경시키는데 사용된다. 호출의 행위는 어떻게 하는가에 따른 값에 의존적이다.
If oldset 는 -null이 아니고, 시그널 마스크의 이전 값은 .IR oldset 내에 저장된다.
The sigpending 호출은 전달 시그널들에 대한 검사를 허용한다. 전달 시그널들의 시그널 마스크는 set내에저장된다.
sigsuspend 호출은 일시적으로 시그널 마스크를 .I mask에 의해 주어진 프로세스들로 대체하고, 시그널이 수신될때까지 프로세스를 중지시킨다.
POSIX에 의하면, 프로세스의 행위는 kill() 또는 raise() 함수들에 의해 생성되지 않는 GFPE, SIGILL, 또는 SIGSEGV를 무시한 후에는 막연해진다. 제로에 의한 정수(Integer) 나누기는 막연한 결과를 갖는다. 일부 아키텍쳐에서, 이는 SIGFPE 시그널을 생성할 것이다. (또한 음수 정수(integer)를 -1로 나누면 SIGFPE를 생성할 수도 있다 ) 이 시그널을 무시하면 무한 루프를 초래할 수 있다.
The POSIX 스펙은 오직 .BR SA_NOCLDSTOP만을 정의한다 . 다른 sa_flags의 사용은 이식이 불가능하다.
SA_RESETHAND 플래그는 동일한 이름의 SVr4 플래그와 호환가능하다.
SA_NODEFER 플래그는 커널 1.3.9과 새로운 버전하에서 동일한 이름의 SVr4 플래그와 호환가능하다.
SVr4 호환성을 위한 SA_RESETHAND 와 SA_NODEFER이름들은오직라이브러리버전3.0.9 그리고 그 이후의 버전에서만 존재한다.
SA_SIGINFO 플래그는 POSIX.1b에 의해서만 명시된다. 이에 대한 지원은 리눅스 2.2에 추가되었다.
sigaction 현재 시그널 처리기에 쿼리를 하기 위해 널 두번째 인수로 호출될 수 있다. 이를 널 두번째 그리고 세번째 인수들로 이를 호출함으로서 현재 머신에 대한 주어진 시그널이 타당한가를 체크하는데 사용될 수 있다.
시그널 체계 조작에 대한 자세한 정보를 얻으려면, .BR sigsetops (3)을 참조하라.