일정 시간 지난 후 자동으로 시그널 발생하게 하는 시그널
alarm - 알람 시그널 생성
#include <unistd.h>
unsigned int alarm(unsigned int sec);
void handler(int signo){
psignal(signo, "received signal");
}
int main(){
sigset(SIGALRM, handler);
alarm(2);
printf("wait\n");
sleep(3);
//sleep(1)이면 1초 뒤에 바로 꺼짐
//alarm은 2초 후에 발생하는 시그널인데 alarm 발생 전에 종료돼서
}
- sec : 알람 발생시킬 때까지 남은 시간 (초 단위)
- 인자로 지정한 시간 지나면 SIGALRM 시그널 생성되어 프로세스에 전달됨
- 프로세스별로 알람시계는 하나 (알람은 하나만 설정 가능)
-> 알람 시그널 생성 전에 다시 alarm 함수 호출 시 재설정됨 - 인자로 0 지정 -> 이전에 설정한 알람 요청 모두 취소됨
- 이전에 호출한 alarm 함수 시간 남아 있으면 그 시간을, 아니면 0 리턴
인터벌 타이머
일정 시간마다 알람 보냄 (타이머 역할)
유닉스 시스템이 제공하는 타이머 종류
- .ITIMER_REAL
- 실제 시간 사용
- 타이머 만료되면 SIGALRM 시그널 생성됨
- ITIMER_VIRTUAL
- 프로세스의 가상 시간 사용, 이 시간은 프로세스가 동작 중일 때만 작동함
- 만료되면 SIGVTALRM 시그널 생성됨
- ITIMER_PROF
- 시스템이 프로세스 위해 실행 중인 시간, 프로세스의 가상 시간 모두 사용
- 만료됨녀 SIGPROF 시그널 생성됨
- ITIMER_REALPROF
- 실제 시간 사용
- 멀티스레드 프로그램의 실제 실행 시간 측정할 때 사용함
- SIGPROF와 관련됨
getitimer (타이머 정보 검색), setitimer (타이머 설정)
#include <sys/time.h>
int getitimer(int which, struct itimerval *value);
int setitimer(int which, const struct itimerval *value, struct itimerval *ovalue);
void handler(){
printf("timer invoked\n");
}
int main(){
struct itimerval it;
sigset(SIGALRM, handler);
it.it_value.tv_sec = 3;
it.it_value.tv_usec = 0;
it.it_interval.tv_sec = 2;
it.it_interval.tv_usec = 0;
setitimer(ITIMER_REAL, &it, (struct itimerval *)NULL);
while(1){
getitimer(ITIMER_REAL, &it);
printf("%d sec, %dmsec.\n",(int)it.it_value.tv_sec, (int)it.it_value.tv_usec);
sleep(1); //1초마다 타이머 울리는지 확인
}
}
- getitimer
- which : 검색할 타이머 종류
- value : 타이머 종류 저장할 구조체 포인터
- setitimer
- which : 설정할 타이머 종류
- value : 설정할 타이머 정보 저장한 구조체 포인터
- ovalue : 이전 타이머 정보 저장할 구조체 포인터 (NULL 가능)
itimerval 구조체
struct itiemrval{
struct timeval it_interval; //몇 초마다 signal 발생시킬건지
//0이면 다음에 타이머 만료될 때 타이머 기능이 멈춤
struct timeval it_value; //만료까지 남은 시간
//0이면 기능 멈춤
}
struct timeval{
time_t tv_sec;
time_t tv_usec;
}