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

Popular posts from this blog

javascript - generate date range base on integers -

PHP and MySQL WP -