C, timer_settime, disarm timer and overwrite associated data? -
i have university project udp, have guarantee reliable communication; packets, want use timer_gettime() , timer_settime() functions, because can queue signals , can associate them timer; in particular, struct sigevent has field union sigval can pass value handler when signal arrived; take advantage of passing handler number of packets timer expired; have problem, , i've done simple program verify this; when start timer, can disarm setting it_value of struct sigevent 0; data doesn't change; if send 100 signal, header receives data of first signal. code:
#include <signal.h> #include <time.h> #include <string.h> #include <stdlib.h> #include <stdio.h> #include <errno.h> #include <unistd.h> int d; void err_exit(char* str) { perror(str); exit(exit_failure); } void sighandler(int sig, siginfo_t *si, void *uc) { (void) sig; (void) uc; d = si->si_value.sival_int; } void handle_signal(struct sigaction* sa) { sa->sa_flags = sa_siginfo; sa->sa_sigaction = sighandler; sigemptyset(&sa->sa_mask); if (sigaction(sigrtmax,sa,null) == -1) err_exit("sigaction"); } void create_timer(struct sigevent* sev,timer_t* timer_id,int i) { union sigval s; s.sival_int = i; printf("value: %d\n",i); sev->sigev_notify = sigev_signal; sev->sigev_signo = sigrtmax; sev->sigev_value = s; timer_create(clock_realtime,sev,timer_id); } void set_timer(timer_t timer_id,struct itimerspec* ts) { if(ts == null) printf("itimerspec null\n"); if (timer_settime(timer_id, 0, ts, null) == -1){ printf("errno code: %d\n",errno); err_exit("timer_settime"); } } void initialize_timerspec(struct itimerspec* ts) { ts->it_value.tv_sec = 2; ts->it_value.tv_nsec = 5; ts->it_interval.tv_sec = 0; ts->it_interval.tv_nsec = 0; } void reset_timer(timer_t timer_id, struct itimerspec* ts) { ts->it_value.tv_sec = 0; ts->it_value.tv_nsec = 0; ts->it_interval.tv_sec = 0; ts->it_interval.tv_nsec = 0; if (timer_settime(timer_id, 0, ts, null) == -1){ printf("errno code: %d\n",errno); err_exit("timer_settime"); } } int main() { struct sigaction sa; struct itimerspec ts[2]; struct sigevent sev[2]; timer_t timer_id[2]; handle_signal(&sa); create_timer(sev,timer_id,0); initialize_timerspec(ts); set_timer(timer_id,ts); reset_timer(timer_id,ts); create_timer(sev + 1,timer_id + 1,1); initialize_timerspec(ts + 1); set_timer(timer_id,ts + 1); printf("id1: %ju id2: %ju\n",timer_id[0],timer_id[1]); sleep(10); printf("d = %d\n",d); exit(exit_success); } i disarm first timer, , send signal; handler receives data associated first signal, because prints 0. there way send overwrite data, sending handler data of second signal(in case 1)?
Comments
Post a Comment