SIGALTSTACK(2)

명칭
sigaltstack - 시그널 스택 문맥의 설정이나 입수

프로그램 라이브러리
libc

서식
<signal.h>

    typedef struct sigaltstack {
            char    *ss_sp;
            size_t  ss_size;
            int     ss_flags;
    } stack_t;

int sigaltstack(const stack_t *ss, stack_t *oss)

해설
sigaltstack() (을)를 사용하는 것으로써, 유저는 시그널을 처리하는 다른 스택을 정의할 수 있습니다. ss 하지만 0 이 아닌 경우, 시그널을 전달한다 시그널 스택 에의 포인터와 사이즈가 지정되어 프로세스가 그 스택으로 동작중일까 제발이 시스템에게 전할 수 있습니다. 핸들러가 시그널 스택으로 동작할 필요가 있다 일을 시그널의 액션이 가리키는 경우 ( sigaction(2) 호출로 지정), 시스템은, 프로세스가 그 스택으로 동작중으로 있는지 어떤지를 체크합니다. 프로세스가 시그널 스택으로 동작하고 있지 않는 경우, 시스템은, 시그널 핸들러의 동작중은 시그널 스택을 적절한 것으로 전환합니다.

SS_DISABLE 하지만 ss_flags 그리고 설정되어 있으면(자), ss_sp (와)과 ss_size (은)는 무시되어 시그널 스택은 무효가 됩니다. 액티브한 스택을 무효로 하려고 하면(자), sigaltstack() (은)는 -1 을 반환 errno (을)를 EINVAL (으)로 설정합니다. 스택이 무효가 되면(자), 모든 시그널은 통상의 유저스택으로 동작하게 됩니다. 스택이 다음에 유효와 대체 스택으로 처리하도록(듯이) 지정된 모든 시그널은, 그 지정대로 재개됩니다.

oss (을)를 0 이외에 하면(자), 현재의 시그널 스택 상태가 되돌려집니다. ss_flags 필드의 값은, 프로세스가 현재 시그널 스택에 있는 경우는 SS_ONSTACK 에, 시그널 스택이 현재 무효인 경우는 SS_DISABLE (이)가 됩니다.

주
치 SIGSTKSZ (은)는, 대체 스택 area를 할당하는 일반적인 케이스로 사용한다 바이트수 / 캐릭터수에 정의됩니다. 대체 스택의 할당에는, 일반적으로 이하와 같은 코드가 사용됩니다.

    if ((sigstk.ss_sp = malloc(SIGSTKSZ)) == NULL)
    	/* error return */
    sigstk.ss_size = SIGSTKSZ;
    sigstk.ss_flags = 0;
    if (sigaltstack(&sigstk, 0) < 0)
    	perror("sigaltstack");

디폴트 사이즈 이외의 특정량의 스택 스페이스를 필요로 한다 시그널 핸들러를 사용하는 프로그램에서는, 다른 방법을 사용할 수 있습니다. 치 MINSIGSTKSZ (은)는, 대체 스택의 실행에 operating system가 필요로 하는 바이트수 / 캐릭터수에 정의되고 있습니다. 대체 스택의 사이즈를 산출하는 경우는, 프로그램으로 스택 요건에 MINSIGSTKSZ (을)를 추가해, operating system의 오버헤드를 허용 할 필요가 있습니다.

시그널 스택은, 스택의 확대 경향과 alignment 요건에 따라 자동적으로 조정됩니다. 시그널 스택은, 하드웨어로 보호된다 일도 되지 않는 것도 있어, 통상의 스택과 같이 자동적으로 ``확대''하지 않습니다. 스택이 오버플로우 해, 스페이스가 보호되어 없는 경우는, 예기치 못한 결과가 되는 일이 있습니다.

반환값

에러
이하중 1 개(살)이 발생하면(자), sigaltstack() (은)는 처리를 실패해, 시그널 스택 문맥은 변경되지 않고 남습니다.

[EFAULT]
    ss 인가 oss 하지만, 프로세스 address 공간의 유효한 부분이 아니다 메모리를 가리키고 있습니다.

[EINVAL]
    액티브한 스택을 무효로 하려고 했습니다.

[ENOMEM]
    대체 스택 area의 사이즈가 MINSIGSTKSZ 이하가 되어 있습니다.

관련 항목
sigaction(2), setjmp(3)

역사
sigaltstack() 의 전 버젼이다 sigstack() 시스템 콜은 4.2BSD 그리고 등장했습니다.