시스템 timer를 두개이상 쓰려고 하는데 하나만 작동하는 경우
글쓴이: cho's / 작성시간: 목, 2004/09/23 - 10:58오후
thread를 쓰려다가 정확하게 초당 제어하려고 시스템 timer를 쓰려고 합니다.
현재 하나의 timer만 실행시에는 정확하게 realtime으로 함수콜이 이루어집니다.
하지만 하나이상의 것을 실행시 그 이전의 timer가 작동하지 않습니다.
SIGALRM이 가면 뒤에 timer가 실행이되서 처음의 timer가 동작하지 않는것 같습니다. 어떻게하면 서로 다른 각각의 timer가 동작하도록 할수 있을까요?
제가 system timer는 처음 써봐서 잘 모르겠습니다.
도움 부탁드립니다. 그럼 즐프하세요.
추가적으로 SIGUSR1으로 설정시에는 매번 콜이 일어나지 조차도 않는군요.
흑흑흑...
#include <signal.h> #include <sys/time.h> #include <sys/ioctl.h> #include <sys/unistd.h> #define TRUE 1 #define FALSE 0 static sigset_t timer_alarm_mask; static struct itimerval itimer_reqst, ovalue; static struct sigaction siga; static sigset_t timer_mask; static struct itimerval itimer_req, value; static struct sigaction sigact; int cnt = 0; int misccnt = 0; static void every_sec_timer_proc(int v){ cnt++; printf("%s called, %d\n", __func__, cnt); } static void every_misc_timer_proc(int v){ misccnt++; printf("%s called, %d\n", __func__, misccnt); } void start_every_sec_timer() { long mics_per_frame; printf("%s\n", __func__); //Set a signal handler for interval timer processing siga.sa_handler = every_sec_timer_proc; siga.sa_flags = SA_RESTART; siga.sa_mask = timer_alarm_mask; if( sigaction(SIGALRM, &siga, NULL) < 0){ return FALSE; } // initialize Posix Timer sigemptyset(&timer_alarm_mask); sigaddset(&timer_alarm_mask, SIGALRM | SIGRTMAX); // Set the initial delay and period of timer, this also arms timer. mics_per_frame = 10; itimer_reqst.it_interval.tv_sec = 0L; //usec is micro second //itimer_reqst.it_interval.tv_usec = (long)mics_per_frame; itimer_reqst.it_interval.tv_usec = (long)2000000; itimer_reqst.it_value.tv_sec = 0L; //itimer_reqst.it_value.tv_usec = (long)mics_per_frame; itimer_reqst.it_value.tv_usec = (long)2000000; if( setitimer(ITIMER_REAL, &itimer_reqst, &ovalue) < 0) return FALSE; return TRUE; } void stop_every_sec_timer() { printf("%s\n", __func__); itimer_reqst.it_interval.tv_sec = 0L; itimer_reqst.it_interval.tv_usec = 0L; itimer_reqst.it_value.tv_sec = 0L; itimer_reqst.it_value.tv_usec = 0L; if( setitimer(ITIMER_REAL, &itimer_reqst, &ovalue) < 0) return FALSE; return TRUE; } void start_every_misc_timer() { long mics_per_frame; printf("%s\n", __func__); //Set a signal handler for interval timer processing sigact.sa_handler = every_misc_timer_proc; sigact.sa_flags = SA_RESTART; sigact.sa_mask = timer_mask; if( sigaction(SIGALRM, &sigact, NULL) < 0){ return FALSE; } // initialize Posix Timer sigemptyset(&timer_mask); sigaddset(&timer_mask, SIGALRM | SIGRTMAX); // Set the initial delay and period of timer, this also arms timer. itimer_req.it_interval.tv_sec = 0L; itimer_req.it_interval.tv_usec = (long)10000; itimer_req.it_value.tv_sec = 0L; //itimer_req.it_value.tv_usec = (long)mics_per_frame; itimer_req.it_value.tv_usec = (long)10000; if( setitimer(ITIMER_REAL, &itimer_req, &value) < 0) return FALSE; return TRUE; } void stop_every_misc_timer() { printf("%s\n", __func__); itimer_req.it_interval.tv_sec = 0L; itimer_req.it_interval.tv_usec = 0L; itimer_req.it_value.tv_sec = 0L; itimer_req.it_value.tv_usec = 0L; if( setitimer(ITIMER_REAL, &itimer_req, &value) < 0) return FALSE; return TRUE; } int main(int argc, char* argv[]) { int i; start_every_sec_timer(); sleep(2); for(i = 0; i < 300000; i++) { char tmp2[100]; strcpy(tmp2, "ksksk"); } start_every_misc_timer(); while(1){ char tmp[100]; strcpy(tmp, "calling testing"); } stop_every_sec_timer(); }
Forums:
setitimer로 제어할 수 있는 timer는 프로세스당 한 개입니다.
setitimer로 제어할 수 있는 timer는 프로세스당 한 개입니다.
대개 많은 OS가 그렇듯이 timer 라는 것은 제약적인 자원이라서 API도 자유자재로 timer resource를 주지 않고, 상당수 하나의 timer로 여러개 효과를 내야합니다.
---
http://coolengineer.com
댓글 달기