setitimer 질문이요
글쓴이: harisoo / 작성시간: 목, 2006/12/21 - 2:34오후
#include <stdio.h> #include <stdlib.h> #include <sys/time.h> #include <time.h> #include <string.h> #include <signal.h> #define TRUE 1 #define FALSE 0 #define PRINT_CTIME 0 void ptimer_handler(int signal) { time_t now; if(signal == SIGPROF) { #if PRINT_CTIME now = time(NULL); printf("get sig prof alarm:%s\n",ctime(&now)); #else printf("get sig prof alarm\n"); #endif } } void vtimer_handler(int signal) { time_t now; if(signal == SIGVTALRM) { #if PRINT_CTIME now = time(NULL); printf("get sig vt alarm:%s\n",ctime(&now)); #else printf("get sig vt alarm\n"); #endif } } void timer_handler(int signal) { time_t now; if(signal == SIGALRM) { #if PRINT_CTIME now = time(NULL); printf("get sig alarm:%s\n",ctime(&now)); #else printf("get sig alarm\n"); #endif } } int risoo_prof_alarm(struct timeval *data) { struct itimerval timer,old; memcpy(&timer.it_value,data,sizeof(struct timeval)); timer.it_interval.tv_sec = 0; timer.it_interval.tv_usec = 0; if(setitimer(ITIMER_PROF,&timer,&old) < 0) { perror("setitimer() "); return FALSE; } return TRUE; } int risoo_vt_alarm(struct timeval *data) { struct itimerval timer,old; memcpy(&timer.it_value,data,sizeof(struct timeval)); timer.it_interval.tv_sec = 0; timer.it_interval.tv_usec = 0; if(setitimer(ITIMER_VIRTUAL,&timer,&old) < 0) { perror("setitimer() "); return FALSE; } return TRUE; } int risoo_real_alarm(struct timeval *data) { struct itimerval timer,old; memcpy(&timer.it_value,data,sizeof(struct timeval)); timer.it_interval.tv_sec = 0; timer.it_interval.tv_usec = 0; if(setitimer(ITIMER_REAL,&timer,&old) < 0) { perror("setitimer() "); return FALSE; } return TRUE; } int main(void) { struct timeval timer; signal(SIGVTALRM,vtimer_handler); signal(SIGPROF,ptimer_handler); signal(SIGALRM,timer_handler); timer.tv_sec = 0; timer.tv_usec = 500000; if(!risoo_vt_alarm(&timer)) { printf("set vt alarm fialed\n"); return 0; } printf("set vt alarm ok\n"); if(!risoo_prof_alarm(&timer)) { printf("set prof alarm fialed\n"); return 0; } printf("set prof alarm ok\n"); if(!risoo_real_alarm(&timer)) { printf("set real alarm fialed\n"); return 0; } printf("set real alarm ok\n"); while(1); return 0; }
setitimer()을 공부하던중 이상한점이 발견되어서 문의 드립니다.
setitimer()에서 flag를 설정가능한것이 3가지가 있는걸로 알고 있습니다.
이 3가지는 각각 다른 시그널을 발생시키는걸로 알고 잇고요.
그래서 3가지를 각각 호출하면 시그널이 어떻게 나오는지 실험해보려고
제가 테스트 코드를 만들어서 햇는데 결과가 이상하게 나오네요
3개 다 호출하면 SIGVTALRM이 한번더 호출되더군요 이상하게..
그래서 ITIMER_PROF가 ITIMER_REAL과 ITIMER_VIRTUAL을 섞어서 쓰기 때문에
그런가 싶어서 ITIMER_REAL를 제외하고 실행시켯는데 안그렇더군요..
또한 특이한것은 시그널이 발생할때마다 시간을 출력시키도록하면
그런경우가 없어집니다.
이렇게 나오는게 정상인가요? 조언부탁드립니다.
File attachments:
첨부 | 파일 크기 |
---|---|
setitimer.c | 2.23 KB |
Forums:
문제 발생하지 않네요.
제 시스템에서 작동시켜보니 두번 발생하거나 하지 않습니다.
그리고 예제와는 상관없지만, signal(2) 함수는 호환성때문에 사용을 권장하지 않는 함수입니다.
되도록이면 sigaction(2) 으로 바꾸시는게 좋습니다.
========================================
* 부분이 전체를 대변하는 하나의 속성일때 진리이다.
영속적이지 못한 것은 전체가 될 수 없다.
========================================
* The truth will set you free.
제 컴퓨터가 이상한가 보네요.
그건 그렇고 signal()함수가 호환성이 안좋은가요?
gnu소스 대부분이 signal()함수를 사용하던데....
왜 안좋은지 설명좀 부탁드릴게요..
매뉴얼을 보시기 바랍니다.
man signal 로 보시면 됩니다. 원래 signal 함수는 옛날 유닉스에서 전해온 함수이며
플랫폼에 따라서 1회성으로 사용되는 경우도 있습니다. (SA_SIGONESHOT 플래그와 동일)
그렇기 때문에 IEEE 1003.1 표준안에서는 signal()부분을 보면
The sigaction() function provides a more comprehensive and reliable mechanism for controlling signals; new applications should use sigaction() rather than signal().
이라고 되어있습니다. 따라서 앞으로는 sigaction()을 쓰시는게 더 좋을겁니다.
========================================
* 부분이 전체를 대변하는 하나의 속성일때 진리이다.
영속적이지 못한 것은 전체가 될 수 없다.
========================================
* The truth will set you free.
댓글 달기