티스토리 뷰
☞ strtol, strtoul, strtoll, strtoull, atol, atoi, atoll
<sys/time.h>
<unistd.h>
int setitimer(int which, const struct itimerval *new, struct itimerval *old);
int getitimer(int which, struct itimerval *old);
unsigned int alarm(unsigned int seconds);
unsigned int sleep(unsigned int seconds);
sleep() 함수는 진행중인 프로세스를 명시적으로 seconds 초 동안 대기 시킬 때 사용합니다.
입력을 기다리거나 소켓 연결을 기다리는 등의 작업은 select()를 사용하는 것이 효과적입니다.
setitimer()와 alarm() 함수는 시간을 지정해서 해당 시간이 도달하면 스스로에게 시그널을 보내도록 하여 해당 시점에 원하는 특정 작업을 수행 시킬 수 있도록 합니다.
☞ 예제1
...... prev_handler = os_set_signal_handler (SIGALRM, gauge_alarm_handler); prev_alarm = alarm (GAUGE_INTERVAL); ...... static void gauge_alarm_handler (int sig) { if (sig == SIGALRM) { fprintf (stdout, MSG_FORMAT "\r", gauge_class_name, class_objects, (class_objects > 0 && approximate_class_objects >= class_objects) ? (int) (100 * ((float) class_objects / (float) approximate_class_objects)) : 100, (int) (100 * ((float) total_objects / (float) total_approximate_class_objects))); fflush (stdout); } else { ; } alarm (GAUGE_INTERVAL); return; }
위의 코드는 큐브리드 DBMS에서 alarm()을 사용한 예제입니다. alarm()을 호출하기 이전에 먼저 SIGALRM 시그널을 처리하기 위한 핸들러 gauge_alarm_handler()를 설정한 것과
시그널 핸들러에서 작업후 다음 시그널을 받기 위해 alarm()을 재설정하는 과정을 참조할 수 있습니다.
alarm()은 시스템의 실시간 타이머를 가지고 운용되는데 alarm() 호출 이전에 동작중인 타이머가 있었다면 해당 타이머의 남은 시간을 리턴하고 없었으면 0을 리턴합니다.
시간 간격인 인수 seconds를 0으로 전달하면 모든 타이머를 중단시킵니다.
setitimer()와 getitimer()는 좀더 정밀한 타이머 설정에 사용합니다.
첫 인수인 which는 어떤 타이머에 대한 작업 인지를 지정하는데 실시간 타이머 TIMER_REAL, 가상 타이머 ITIMER_VIRTUAL, 프로파일링 타이머 ITIMER_PROF를 지정할 수 있습니다.
타이머 설정과 읽기에 사용하는 구조체 struct itimerval에는 구조체 struct timeval 타입인 it_interval과 it_value 항목으로 타이머 운용을 지정 할 수 있습니다.
it_interval은 반복적인 타이머 운용시 타이머 간의 간격을 의미하고 0이면 한번만 전송함을 의미합니다.
it_value는 첫 타이머 시그널까지의 시간으로 0이면 타이머는 운용되지 않습니다.
setitimer()와 getitimer()는 정상적이면 0, 실패면 -1을 리턴합니다.
'C | C++' 카테고리의 다른 글
시그널의 종류와 핸들러 (0) | 2018.08.04 |
---|---|
비지역적 점프 (0) | 2018.08.04 |
문자열의 일시 변환 (0) | 2018.06.29 |
일시의 문자열 변환 (0) | 2018.06.29 |
시간과 일자 관련 함수 (0) | 2018.06.29 |