시스템 프로그래밍

시스템 프로그래밍 10장 - Signal 2

만능성구 2020. 6. 11. 01:26
728x90
#include<signa.h>
int sigprocmask(int how, const sigset_t *set, sigset_t *oset);
어떤 signal이 전달되었을 때 전달 받지 않도록 mask한다.
signal block / unblock한다.
block되면 unblock될 때가지 연기된다.

how : block / unblock 할건지에 대해서
set : 프로세스에서 signal에 대해 설정한 변수(setting 된 값)
sigset_t(process에서 blocking을 하거나 unblocking을 할 signal에 설정을 해준 data)에 원하는 signal masking할건지 안할건지 setting된 변수. 별도 함수로 setting한다.
oset : 현재 setting mask값을 반환받을 값(되돌리고 싶을 때 사용)

return 0 / -1

how description

- SIG_BLOCK : 현재 전달하는 mask set에 대해서 block을 해라 (for blocking)

- SIG_UNBLOCK : signal set 대해 unblock해라 (for unblocking)

- SIG_SETMASK : set mask signal set을 대체해서 mask 값을 해라 (for blocking)

sigset변수에 대해서 어떤 signalblock하고 안할것인지 설정하는 함수

#incldue <signal.h>
// for initializing of a set
int sigemptyset (sigset_t *set);
sigset을 초기화하는 함수
unmask 상태로 초기화 해준다.
set : signal mask 변수
return 0 / -1
#incldue <signal.h>
int sigfillset (sigset_t *set);
sigset을 모두 mask로 설정
모든 signal함수를 blocking한다.
 
return 0 / -1
#incldue <signal.h>
int sigaddset (sigset_t *set, int signo);
특정 signal에 대해서만 masking을 해준다.
해당되는 signal number에 대해서 masking해준다.
이거하고 sigprocmask()를 호출해야 masking이 동작한다.

set : sigset_t변수
signo : signal number
return 0 / -1
#incldue <signal.h>
int sigdelset (sigset_t *set, int signo);
특정 signal mask으로부터 해제하는
이거하고 sigprocmask()를 호출해야 masking이 동작한다.
set: sigset_t변수
signo : signal 
return 0 / -1
#incldue <signal.h>
int sigismember (sigset_t *set, int signo);
특정 signal mask되어 있는 확인한다.
이거하고 sigprocmask()를 호출해야 masking이 동작한다.
set: sigset_t변수
signo : signal 
return 1 / -1
#incldue <signal.h>
int sigpending (sigset_t *set);
mask signal이 전달될 경우 process handling하지 않는다. pending된 상태이다.
 pending된 상태를 확인하는 함수
set : sigset_t변수에 어떤 pendding signal을 확인한다.
return 0 / -1
#incldue <signal.h>
int sigsuspend(const sigset_st *set);
임시적으로 mask set값을 기존 mask set값에 replace하고 pause한다.
현재 arg signal masking하고 masking signal은 전달 안된다. 전달 받을 수 잇는 signal이 전달될 때가지 pause
원하는 signal을 막아놓고 다른 signal을 기다린다.
어떤 signal이 전달되면 pause를 하고 반환된다. 어떤 signal 핸들러가 mask는 호출 이전의 값으로 돌아간다.
signal process를 종료하면 반환되지 않는다.

 
 
#incldue <signal.h>
unsigned int sleep (unsigned int seconds);
몇초 뒤에 alarm이란 signal이 자기 자신에 전달
sleep alarm 동일.
seconds : 시간 초
return 0

System call and a signal

어떤 processsystemcall 동작실행 중에 signal이 발생했을 때

file을 읽고 쓰는 도중에(blocking I/O) 인경우

진행하던 I/O 마무리하고 수행

I/O가 끝나기 전에 signal을 수행할 것인지

 

Type 1

마무리하고 수행한 경우 interrupt가 발생하지 않도록 설정할 수 있다.

linux’s blocked state = TAST_UNINTURRUPTIBLE

Type 2

signal을 먼저 handling하도록 설정할 수 있다. I/O 멈추고 handling

linux’s blocked state = TAST_INTURRUPTIBLE

handling이후에

        linux default : 실행하던 I/O 이어서 실행

        다른 버전 : 해당 I/0 종료하고 error 발생시킨다.   

siginterrrupt(siganl_no, TURE / FALSE) 마무리하고 싶으면 FALSE

 

alarm-getchar.c

728x90