sigaction

Autres langues

Langue: ko

Version: 8 May 1999 (fedora - 25/11/07)

Section: 2 (Appels système)

이름

sigaction, sigprocmask, sigpending, sigsuspend - POSIX 시그널 처리 함수

사용법

#include <signal.h>

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);

설명

The sigaction 시스템 호출은 특정 시그널의 수신 상에서 프로세스에 의해 취해진 액션을 변경하는데 사용된다.

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_NOCLDSTOP
만일 signum SIGCHLD, 이 자식 프로세스가 중지되었을때, 이 통고를 수신하지 못하면,
 (예를 들어, 자식 프로세스들이  SIGSTOP, SIGTSTP, SIGTTIN 또는 SIGTTOU을수신할때)
SA_ONESHOT 또는 SA_RESETHAND
일단 시그널 처리기가 호출되면, 디폴트 상태에 대한 시그널 액션을 재저장한다. (이는 .BR signal (2) 호출에 대한 기본 행위이다.)
SA_RESTART
일부 시스템 호출들이 시그널을 통해 재시작할 수 있도록 함으로서 BSD 시그널 의미와 호환되는 행위를 제공한다.
SA_NOMASK or SA_NODEFER
시그널이 자체 시그널 처리기로부터 수신받지 않도록 한다.
SA_SIGINFO
The signal handler takes 3 arguments, not one. In this case, should be set instead of 시그널 처리기는 하나가 아닌, 3개의 인수를 취한다. 이 경우, sa_handler대신에.Isa_sigaction이설정되어야한다. (sa_sigaction 필드는 리눅스 2.1.86에서 추가되었다.)

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_signo, si_errno 그리고 si_code은모든시그널에대해정의되었다. kill(2), POSIX.1b 시그널과 SIGCHLD은 si_pidsi_uid을채운다. SIGCHLD은 또한 si_status, si_utime 그리고 si_stime을채운다. si_int 그리고 si_ptr은POSIX.1b시그널의송신자에의해명시된다. 좀더 자세한 사항을 보려면, SIGILL, SIGFPE, SIGSEGV 그리고 SIGBUS은 si_addr를 오류의 주소로 채운다. SIGPOLL 은 si_bandsi_fd를채운다. si_code 는 왜 시그널이 보내졌는지에 대해 지시한다. 이는 bitmask,가 아닌 값이다. 모든 시그널에 대해 가능한 값은 이 테이블에 나열되어 있다.
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 호출은 현재 블록화된 시그널들을 변경시키는데 사용된다. 호출의 행위는 어떻게 하는가에 따른 값에 의존적이다.

SIG_BLOCK
일련의 블록화된 시그널들은 현재 설정과 .I set 인수의 합이다.
SIG_UNBLOCK
The signals in set 내의 시그널들은 현재 일련의 블록화된 시그널들에서 삭제된다. 블록화되지 않은 시그널에 대해 블록화하지 않는것이 타당하다.
SIG_SETMASK
블록화된 시그널들의 설정은 인수 .IR set 으로 설정된다.

If oldset 는 -null이 아니고, 시그널 마스크의 이전 값은 .IR oldset 내에 저장된다.

The sigpending 호출은 전달 시그널들에 대한 검사를 허용한다. 전달 시그널들의 시그널 마스크는 set내에저장된다.

sigsuspend 호출은 일시적으로 시그널 마스크를 .I mask에 의해 주어진 프로세스들로 대체하고, 시그널이 수신될때까지 프로세스를 중지시킨다.

반환값

sigaction, sigprocmask, sigpending 그리고 sigsuspend 은 성공하면 0을 실패하면 -1을 리턴한다.

에러

EINVAL
부적절한 시그널이 지정되었다. 감지되지 않는 .BR SIGKILL " 또는 " SIGSTOP에 대한 액션을 변경하고자 한다면, .B EINVAL이 또한 생성될 것이다.
EFAULT
act, oldact, set 또는 oldset 는 프로세스 주소 영역 중 타당하지 않은 부분인 메모리를 가리킨다.
EINTR
시스템 호출이 인터럽트되었다.

주의

sigprocmask 호출로 .BR SIGKILL " 또는 " SIGSTOP을 블록화하는 것은 불가능하다. 이러한 시도는 무시된다.

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_RESETHANDSA_NODEFER이름들은오직라이브러리버전3.0.9 그리고 그 이후의 버전에서만 존재한다.

SA_SIGINFO 플래그는 POSIX.1b에 의해서만 명시된다. 이에 대한 지원은 리눅스 2.2에 추가되었다.

sigaction 현재 시그널 처리기에 쿼리를 하기 위해 널 두번째 인수로 호출될 수 있다. 이를 널 두번째 그리고 세번째 인수들로 이를 호출함으로서 현재 머신에 대한 주어진 시그널이 타당한가를 체크하는데 사용될 수 있다.

시그널 체계 조작에 대한 자세한 정보를 얻으려면, .BR sigsetops (3)을 참조하라.

호환

POSIX, SVr4. SVr4 는 EINTR 조건에 대한 문서를 제공하지 않는다.

관련 항목

kill(1), kill(2), killpg(2), pause(2), raise(3), siginterrupt(3), signal(2), signal(7), sigsetops(3), sigvec(2)

역자

ASPLINUX<man@asp-linux.co.kr>, 2000년 7월 29일