시스템 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
댓글 달기