int main()
{
int i=0;
timer_t t_id[100];
for(i=0; i<100; i++)
makeTimer(NULL, &t_id[i], i+1, 0);
/* Do busy work. */
while (1);
}
static int makeTimer(char *name, timer_t *timerID, int sec, int msec)
{
struct sigevent te;
struct itimerspec its;
struct sigaction sa;
int sigNo = SIGRTMIN;
/* Set up signal handler. */
sa.sa_flags = SA_SIGINFO;
sa.sa_sigaction = timer_handler;
sigemptyset(&sa.sa_mask);
if (sigaction(sigNo, &sa, NULL) == -1)
{
printf("sigaction error\n");
return -1;
}
/* Set and enable alarm */
te.sigev_notify = SIGEV_SIGNAL;
te.sigev_signo = sigNo;
te.sigev_value.sival_ptr = timerID;
timer_create(CLOCK_REALTIME, &te, timerID);
its.it_interval.tv_sec = sec;
its.it_interval.tv_nsec = msec * 1000000;
its.it_value.tv_sec = sec;
its.it_value.tv_nsec = msec * 1000000;
timer_settime(*timerID, 0, &its, NULL);
return 0;
}
static void timer_handler(int sig, siginfo_t *si, void *uc)
{
timer_t *tidp;
tidp = si->si_value.sival_ptr;
/* how to know the timer_id with index? */
}
이 코드에서는 배열 구조로 만든 타이머를 여러 개 만들었습니다.여러 타이머 신호를 처리하는 방법
시간 초과 이벤트가 발생하면 모든 타이머가 하나의 timer_handler를 공유합니다. 그러나 어떤 인덱스 (t_id [index]) 시간 초과가 발생했는지 어떻게 알 수 있습니까?
가능합니까? 나는 어떤 인덱스의 타임 아웃이 발생했는지 알고 싶다.
당신은 해고시킨 타이머를 식별하는 멤버를 포함하는 구조체에'sival_ptr' 점을 가질 수 있습니다. – EOF
그러나 처리기에서 타이머 인덱스를 어떻게 알 수 있습니까? '경우 (* tidp == t_id [0]) 다른 경우 (* tidp == t_id [1]) 또 경우 (* tidp == t_id [2]) ... ' 너무 크다 많은 타이머를 다루는 것 – allen
@EOF가 말했듯이 구조체를 사용하십시오. 구조체는'timer_t' 식별자와 배열 인덱스 (또는 특정 타이머에 대한 다른 고유 한 식별자)를 포함 할 수 있습니다. 그런 다음'timer_t' 배열 대신에이 구조의 배열을 만듭니다. –