42 Seoul
[42Seoul/minitalk] 개념 2편
jaewpark
2021. 9. 25. 14:12
sigset_t 구조체
1
2
3
|
typedef struct {
unsigned int __sigbits[4];
} sigset_t;
|
cs |
시그널은 비트로 이루어져 있으며, 시그널 집합은 이러한 시그널을 비트 마스크로 표현
만약 특정 비트값이 1이면 해당 위치에 대한 시그널이 설정되어 있다는 의미이고, 0이면 설정되어 있지 않다는 뜻
sigemptyset
- 헤더 : signal.h
- 형태 : int sigemptyset(sigset_t *set)
- 반환 : 0
- sigset을 초기화
sigaddset
- 헤더 : signal.h
- 형태 : int sigaddset(sigset_t *set, int signo)
- 반환 : 0
- signo를 sigset에 추가
sigaction
- 헤더 : signal.h
- 형태 :
12345678910111213141516struct sigaction {union __sigaction_u __sigaction_u; /* signal handler */sigset_t sa_mask; /* signal mask to apply */int sa_flags; /* see signal options below */};union __sigaction_u {void (*__sa_handler)(int);void (*__sa_sigaction)(int, siginfo_t *,void *);};#define sa_handler __sigaction_u.__sa_handler#define sa_sigaction __sigaction_u.__sa_sigactionint sigaction(int sig,
const struct sigaction *restrict act, struct sigaction *restrict oact)cs - 반환 : 0
- sa_flags는 다음과 같은 값이 들어오며, or 연산자를 이용하여 두 개 이상의 값을 한 번에 패러미터로 넘겨줄 수도 있다
- SA_NOCHDSTOP : 시그널이 SIGCHD라면, 자식 프로세스가 종료될 때만 생성되고 자식 프로세스가 중지될 때는 생성되지 않는다.
- SA_NOCHDWAIT : 시그널이 SIGCHLD이면 시스템은 자식 프로세스가 종료될 때 좀비 프로세스를 만들지 않는다.
- SA_ONSTACK : 비트가 설정되면 시그널 스택 (sigaltstack) 에 올라가 있는 프로세스로 시그널을 전달
- SA_NODEFER : 처리기 실행 중에 전달된 시그널이 블록되지 않도록 한다
- SA_RESETHAND : 핸들러는 신호가 전달되는 순간 SIG_DFL로 재설정
- SA_RESTART : 시그널을 받으면 시그널 처리 후 시그널 핸들러에 의해 중지된 기능을 재시작
- SA_SIGINFO : sa_handler에 해당하는 함수가 동작하지 않고, sa_sigaction이 동작하며 더 다양한 인수를 받을 수 있다, sa_sigaction이 받는 인자값은 시그널 번호, 시그널이 만들어진 이유, 시그널을 받는 프로세스의 정보이다. SIG_DFL과 SIG_IGN이 사용될 땐 해당 비트를 사용하면 안 된다
- sa_handler는 sigaction() 함수의 인자로 들어온 sig 시그널이 발생했을 때 실행할 함수이며, signal() 함수에서 인자값으로 넣어주는 핸들러 함수가 여기에 들어간다
- sa_sigaction은 sa_flags에 SA_SIGINFO가 설정되어 있을 때만 호출된다 (SA_SIGINFO가 설정되어 있지 않으면 sa_handler가 호출되고, SA_SIGINFO가 설정되어 있으면 sa_sigaction이 호출됨)
- sa_mask는 시그널을 처리하는 동안 블록할 시그널 집합의 마스크이며, 시그널 핸들러 동작 중에, 다른 시그널들이 들어와도 블록할 수 있도록 막아준다. 이때 sa_flags에 SA_NODEFER를 설정하지 않으면 시그널 핸들러를 호출하게 한 시그널도 블록됨
pause
- 헤더 : unistd.h
- 형태 : int pause(void)
- 반환 : 항상 -1
- pause() 함수는 kill 함수나 inteval 타이머에서 신호가 수신될 때까지 호출 스레드를 일시 중지
sleep
- 헤더 : unistd.h
- 형태 : unsigned int sleep(unsigned int sec)
- 반환 : 요청 시간 경과시 반환 0,
- 초가 경과하거나 신호가 스레드에 전달될 때까지 호출 스레드의 실행을 일시 중단
- sleep 중간에 시그널이 발생하면 바로 복귀 후 남은 시간이 반환
usleep
- 헤더 : unistd.h
- 형태 : int usleep(useconds_t microseconds)
- 반환 : 성공시 0, 실패시 -1이 반환되고 전역 변수 errno가 오류
- 마이크로 초만큼 일시 중단
구현해야 되는 사항은
SIGUSR1이 SERVER의 PID로 문자열을 입력
SIGUSR2은 CLIENT로 주어진 문자열을 출력
필요한 것은 출력하는 함수
PID 관련 getpid를 통해서 출력으로 알려줘야 하기 떄문에 관련 출력 함수