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

PHP and MySQL WP -

android - InAppBilling registering BroadcastReceiver in AndroidManifest -

go - golang pprof for c library code -