sigsuspend함수 이전에 pause함수
프로세스를 일시 중단시키는 함수부터 아라보자.
sigsuspend
Interface | int sigsuspend(sigset_t *sigmask) |
Parameter | sigmask: process를 중단시킴과 동시에 블록(무시할) signal set |
Function | 호출한 프로세스를 중단시킴과 동시에 시그널 셋을 블록시킴. |
Return | Always -1 errno 설정 |
<다음 코드에서 헛점을 알 수 있을까?>
sigfillset(&sigmost); // 모든 시그널을 sigmost에 포함!
sigdelset(&sigmost, signum); // 모든 시그널 중 signum만 제외시킴
sigsuspsend(&sigmost); // signum을 제외한 모든 시그널을 Block시킴과 동시에 프로세스 중단
코드의 본래 목적
-> signum 시그널이 도착해야만 프로세스의 중단상태가 해제되길 바람.
but!!!
※ 만약 signum 시그널이 sigsuspend가 수행되기 전에 도착한다면?
sigdelset ---------------------- sigsuspend
↑↑↑↑↑↑↑↑
요구간에 signum signal 전달되면?
다음번 signum 시그널이 다시 오기 전까지 프로세스는 영원히 중단상태...
oh shit~
개선된 코드
14번라인 "모든 시그널을 일단 block 시킴!"을 주목.
기존 코드에서는 sigreceived를 검사하고 sigsuspend를 호출하기전 빈 타이밍에
특정 시그널이 왔을 때 생기는 문제가 있었으나
이제 모든 시그널을 블록시킴으로 "특정 시그널이 오지 않은 상태(윗 코드에선 signum signal) 확인 된 타이밍에만 sigsuspend!"
개선된 코드 2
개선된 코드1은
모든 signal에대해 마스크에 추가해서 모두 블록시키는 것이고
이번 코드2는 다른 signal에 대해서도 가능성은 열어두되
정해둔 signum(SIGUSR1)에 대해서만 완벽히 프로세스 중단상태를 해제할 수 있도록 했다.
가정: 오로지 signum에 대한 시그널 핸들러에 대해서만 sigreceived 값이 1로 바뀔수 있음.
:)
'LINUX > Linux' 카테고리의 다른 글
GCC, G++ (C, C++ Compiler) (0) | 2019.11.10 |
---|---|
Asynchronous I/O 관련 함수 (0) | 2019.06.16 |
Signal mask, set 함수 (0) | 2019.06.15 |
Signal 생성 함수, 예제 (0) | 2019.06.15 |
Signal 개념 (0) | 2019.06.15 |