시스템 프로그래밍
시스템 프로그래밍 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변수에 대해서 어떤 signal을 block하고 안할것인지 설정하는 함수
#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
어떤 process가 systemcall 동작실행 중에 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