signal

signal

  • sw interrupt

  • 비동기적으로 아무 thread를 끊고 실행됨

  • 그래서 thread-safe하지 않다. (출력 깨짐, 데이터 경쟁, deadlock 가능)

  • 안전하게 처리하기 위해

    • sigwait: block된 signal을 처리 (모든 thread가 해당 signal을 blocking하고 있어야함)
    • handler에선 최소한의 작업만 수행
      • async-signal-safe한 작업만 수행
  • signal 함수의 type

    • void (*signal(int signo, void (*func)(int)))(int)
      • void (*func)(int)를 인자로 받고,리턴함

sigsuspend

while (condition) {
	// 여기서 signal이 오면 무한 대기 함
	pause(); // signal이 올 때까지 대기
}

while (condition) {
	// 여기서 signal이 와도 잡을 수 있음
	sigsuspend(&sigset); // signal이 올 때까지 대기, 
}

sigset

sigset_t sigset;

sigemptysent(&sigset); // 비어있도록 초기화
sigfillset(&sigset); // 꽉 차있도록 초기화
sigaddset(&sigset, signo); // signo를 추가
sigdelset(&sigset, signo); // signo를 제거
sigismember(&sigset, signo); // signo가 있는지 확인 1이면 존재, 0이면 없음

sigprocmask(how, &sigset, &oldsigset);
// how: SIG_BLOCK, SIG_UNBLOCK, SIG_SETMASK

sigpending(&sigset); // pending 되어있는 sig들을 표시