SIGVEC(2)

명칭
sigvec - 소프트웨어 시그널 기능

프로그램 라이브러리
libc

서식
<signal.h>

    struct sigvec {
            void     (*sv_handler)();
    	int      sv_mask;
    	int      sv_flags;
    };

int sigvec(int sig, struct sigvec *vec, struct sigvec *ovec)

해설
이 인터페이스는, sigaction(2) (으)로 옮겨졌습니다.

시스템에서는 시그널의 집합을 정의하고 있어, 이것들은 프로세스에 전달되는 일이 있습니다. 시그널의 전달은, 하드웨어 새치기의 발생을 닮아 있습니다. 시그널의 새로운 발생은 블록 되어 현재의 프로세스 문맥은 보존되어, 새로운 프로세스 문맥이 작성됩니다. 프로세스는, 시그널의 전달처 handler (을)를 지정하는 일도 있으면, 시그널을 블록 하는 것 및 무시하는 것 (을)를 지정하는 일도 있습니다. 시그널이 발생했을 경우에, 시스템이 디폴트의 액션을 잡는다 일을 지정하는 일도 가능합니다. 통상의 경우, 시그널 핸들러는, 프로세스의 현행 스택으로 동작합니다. 이것은, 핸들러마다 변경해, 시그널이 특수한 시그널 스택 그리고 핸들 되도록 할 수 있습니다.

모든 시그널의 우선 순위 (은)는 같습니다. 시그널 routine는, 소환의 원인이 된 시그널이 블록 되었다 상태로 동작합니다만, 그 외의 시그널이 발생할 가능성은 있습니다. 글로벌인 시그널 마스크 에는, 프로세스에의 전달이 현재 블록 되고 있는 시그널의 집합이 정의되고 있습니다. 프로세스의 시그널 마스크는, 부모의 시그널 마스크에 초기화됩니다 (통상은 0). 시그널 마스크는, sigblock(2) 인가 sigsetmask(2) (을)를 호출하는지, 시그널이 프로세스에 전달되었을 경우로 변경될 수 있습니다.

시그널 조건이 프로세스로 발생하면(자), 그 시그널이, 프로세스로 보류가 되어 있는 시그널의 집합에 추가됩니다. 그 시그널이 프로세스로 현재 블록 되어 있지 않은 경우는, 프로세스에 전달됩니다. 시그널이 전달되면(자), 프로세스의 현재 상태가 보존되어 새로운 시그널 마스크가 이하로 설명하도록(듯이) 산출되어, 시그널 핸들러가 불려 갑니다. 핸들러의 호출은, 시그널 처리 routine가 정상적으로 돌아왔을 경우에 프로세스가 시그널 전달전의 문맥으로 실행을 재개하도록(듯이) 편성됩니다. 프로세스가 다른 문맥에서의 재개를 바라는 경우는, 프로세스가 전의 문맥 그 자체를 회복하도록(듯이) 편성할 필요가 있습니다.

시그널이 프로세스에 전달되면(자), 새로운 시그널 마스크가, 프로세스의 시그널 핸들러가 계속되는 동안 (또는 sigblock(2) 인가 sigsetmask(2) 하지만 불려 갈 때까지) 설치됩니다. 이 마스크는, 현재의 시그널 마스크에, 전달되는 시그널을 추가해, 불려 가는 핸들러에 관련한 시그널 마스크와의 논리합을 취해 형성됩니다.

sigvec() (은)는, 특정의 시그널에 핸들러를 할당합니다. vec (을)를 0 이외에 했을 경우는, 지정한 시그널을 전달하는 경우에 사용한다 핸들러 routine와 마스크가 지정됩니다. SV_ONSTACK 비트가 sv_flags 그리고 설정되어 있는 경우, 시스템은, sigaltstack(2) 그리고 지정되었다 시그널 스택 의 프로세스에 시그널을 전달합니다. ovec (을)를 0 이외에 했을 경우는, 시그널의 전의 처리 정보가 유저에게 돌려주어집니다.

이하는 모든 시그널의 리스트입니다. 명칭은, 인클루드 파일 <signal.h> (와)과 같습니다.
명칭 디폴트 액션 설명
SIGHUP | 프로세스의 종료 |  | 단말 라인의 행업
SIGINT | 프로세스의 종료 |  | 프로그램의 새치기
SIGQUIT | core image의 작성 |  | 프로그램의 종료
SIGILL | core image의 작성 |  | 부정한 인스트럭션
SIGTRAP | core image의 작성 |  | 트랩의 추적
SIGABRT | core image의 작성 | abort(3)
의 호출 (이전의 SIGIOT)
SIGEMT | core image의 작성 | 실행한 인스트럭션의 에뮤레이트
SIGFPE | core image의 작성 | 부동 소수 예외
SIGKILL | 프로세스의 종료 | 프로그램의 종료
SIGBUS | core image의 작성 | 버스 에러
SIGSEGV | core image의 작성 | 분할 위반
SIGSYS | core image의 작성 | 존재하지 않는 시스템 콜의 호출
SIGPIPE | 프로세스의 종료 | 읽기측이 없는 파이프에서의 기록
SIGALRM | 프로세스의 종료 | 리얼타임 타이머의 만료
SIGTERM | 프로세스의 종료 | 소프트웨어 종료 시그널
SIGURG | 시그널의 방폐 | 긴급사태가 소켓에 존재
SIGSTOP | 프로세스의 정지 | 정지 (보충도 무시도 할 수 없습니다)
SIGTSTP | 프로세스의 정지 | 키보드로부터 생성된 정지 시그널
SIGCONT | 시그널의 방폐 | 정지 후의 계속
SIGCHLD | 시그널의 방폐 | 자 스테이터스의 변화
SIGTTIN | 프로세스의 정지 | 제어 단말로부터 백그라운드 읽기 하려고 했다
SIGTTOU | 프로세스의 정지 | 제어 단말에 백그라운드 기록 하려고 했다
SIGIO | 시그널의 방폐 | 기술자에게
I/O 가능 ( fcntl(2) 참조)
SIGXCPU | 프로세스의 종료 | cpu 제한 시간의 초과 (
setrlimit(2) 참조)
SIGXFSZ | 프로세스의 종료 | 파일 사이즈 제한의 초과 (
setrlimit(2) 참조)
SIGVTALRM | 프로세스의 종료 | 가상 시간 알람 (
setitimer(2) 참조)
SIGPROF | 프로세스의 종료 | 프로 파일링 타이머 알람 (
setitimer(2) 참조)
SIGWINCH | 시그널의 방폐 | 윈도우 사이즈의 변화
SIGINFO | 시그널의 방폐 | 키보드로부터의 스테이터스 요구
SIGUSR1 | 프로세스의 종료 | 유저 정의 시그널 1
SIGUSR2 | 프로세스의 종료 | 유저 정의 시그널 2

시그널 핸들러가 설치되면(자), sigvec() (을)를 재차 호출할까 execve(2) (을)를 실행할 때까지 시그널 핸들러는 설치된 채로 남습니다. 시그널에 고유한 디폴트 액션에는, sv_handler (을)를 SIG_DFL (으)로 설정하는 것으로 리셋트 할 수 있습니다. 디폴트는, 프로세스의 종료 (코어덤프가 놓치는 일도 있습니다), 액션 이루어, 프로세스의 정지, 프로세스의 계속입니다. 각각의 시그널의 디폴트 액션에 대해서는, 위의 시그널 리스트를 참조해 주세요. sv_handler 하지만 SIG_IGN 인 경우, 시그널의 현재와 보류중의 인스턴스는 무시되어 방폐됩니다.

이하의 리스트의 시스템 콜중에 시그널이 보충되면(자), 통상의 경우, 호출은 재개됩니다. SV_INTERRUPT 비트를 sv_flags 그리고 설정하는 것으로, 시스템 콜은, EINTR 에러치를 수반해, 도중에 종료하도록(듯이) 강제 가능합니다. 영향을 받는 시스템 콜은, 통신 채널인가 늦은 디바이스 (단말등으로, 통상 파일은 아니다)에 대한다 read(2), write(2), sendto(2), recvfrom(2), sendmsg(2), recvmsg(2) (와)과 wait(2), ioctl(2) 의 도중에. 그러나, 벌써 실행되고 있는 시스템 콜은 재개되지 않고, 부분적인 결과 (짧은 읽기 카운트등)를 돌려줍니다.

fork(2) 인가 vfork(2) 의 다음에는, 모든 시그널, 시그널 마스크, 시그널 스택, 재개 / 새치기 플래그가 아이에게 계승됩니다.

execve(2) (은)는, 보충된 모든 시그널의 디폴트 액션을 바탕으로 되돌려, 유저스택으로 보충되는 모든 시그널을 리셋트 합니다. 무시된 시그널은 무시된 채로 남습니다. 시그널 마스크는 같은 상태인 채입니다. 시스템 콜에 끼어드는 시그널은, 새치기를 계속합니다.

주
vec (으)로 지정한 마스크에서는, SIGKILL (와)과 SIGSTOP (을)를 블록 할 수 없습니다. 이것은, 시스템이 암묵적으로 부과하는 제한 사항입니다.

4.2BSD 그럼 SV_INTERRUPT 플래그를 사용할 수 없기 때문에, 하위 호환성이 필요한 경우는 사용하지 말아 주세요.

반환값

에러
이하중 1 개(살)이 발생하면(자), sigvec() (은)는 에러가 되어, 새로운 시그널 핸들러는 설치되지 않습니다.

[EFAULT]
    vec 인가 ovec (은)는, 프로세스에 할당할 수 있었던 address 공간의 범위외를 가리키고 있습니다.

[EINVAL]
    Sig 하지만, 올바른 시그널 번호가 되어 있지 않습니다.

[EINVAL]
    SIGKILL 인가 SIGSTOP 의 핸들러를 무시할까 제공하려고 했습니다.

관련 항목
kill(1), kill(2), ptrace(2), sigaction(2), sigaltstack(2), sigblock(2), sigpause(2), sigprocmask(2), sigsetmask(2), sigsuspend(2), setjmp(3), siginterrupt(3), signal(3), sigsetops(3), tty(4)

사용예
VAX-11 그럼, 이하와 같이 핸들러 routine를 선언할 수 있습니다.

    void handler(sig, code, scp)
    int sig, code;
    struct sigcontext *scp;

sig (은)는, 하드웨어 fault와 트랩의 MAP 대상의 시그널 번호이며, 아래와 같이 정의됩니다. code (은)는, 아래에서 정의하는 정수, 또는 호환성 모드 fault의 경우는, 하드웨어가 제공하는 코드로 어느 파라미터입니다 (호환성 모드 fault는, psl에 PSL_CM 하지만 설정되어 있는 것으로부터, 다른 SIGILL 트랩과 구별됩니다). scp (은)는, sigcontext 구조체 ( <signal.h> 그리고 정의)에의 포인터로, 시그널전에 문맥을 복원하기 위해서(때문에) 사용됩니다.

버그
이 메뉴얼 페이지는 불명확입니다.