c - select interrupted system call -
i creating timer runs approximately every second , waiting key pressed (which not doing). while running shows:
select : interrupted system call select : interrupted system call select : interrupted system call select : interrupted system call
can tell me why happening:
struct sigaction s1; static timer_t tid3; sigfillset(&s1.sa_mask); s1.sa_flags = sa_siginfo; s1.sa_sigaction = signalhandler; if (sigaction(sigu, &s1, null) == -1) { perror("s1 failed"); exit( exit_failure ); } printf("\ntimer %d setting \n",timeridentity); tid3=settimer(sigu, 1000, 1); // ---------- set timer values ------------------- static struct sigevent sigev; static timer_t tid; static struct itimerspec itval; static struct itimerspec oitval; sigev.sigev_notify = sigev_signal; sigev.sigev_signo = signo; sigev.sigev_value.sival_ptr = &tid; if (timer_create(clock_realtime, &sigev, &tid) == 0) { itval.it_value.tv_sec = sec/1000; itval.it_value.tv_nsec = (long)(sec % 1000) * (1000000l); //itval.it_value.tv_nsec = 0; if (mode == 1) { itval.it_interval.tv_sec = itval.it_value.tv_sec; itval.it_interval.tv_nsec = itval.it_value.tv_nsec; } if (timer_settime(tid, 0, &itval, null) == 0) { printf("timer_settime \n"); } else { perror("time_settime error!"); } } //---------------- signal handler ---------------- void signalhandler(int signo, siginfo_t* info, void* context) { else if (signo == sigu) // keypad being pressed { calltimer3function(); }
}
//-----------------calltimer3function------------------------ unsigned char key5_debounce=0,key5_debounce_count=0; calltimer3function() { if(!key5_debounce) { if((gpioread(input_sw5)==0)) { key5_debounce=1; } } if(key5_debounce) { if((gpioread(input_sw5)==0)) { key5_debounce_count++; } else key5_debounce=0; if(key5_debounce_count>=key_debounce) { printf("key5 pressed\n"); extr_count=1; printf("\ndisplay menu called"); display_menu(); key5_debounce=0; key5_debounce_count=0; } } }
it may worth mentioning 2 things:
- blocking functions such
select
,read
, etc.. interrupted signals. may setsa_restart
flag when callingsigaction
.man signal(7)
:
if signal handler invoked while system call or library function call blocked, either:
- the call automatically restarted after signal handler returns; or
- the call fails error eintr.
which of these 2 behaviors occurs depends on interface , whether or not signal handler established using sa_restart flag (see sigaction(2)). details vary across unix systems; below, details linux.
- in signal handler should call async signal safe functions. or use the self-pipe trick avoid doing in signal handler @ all.
alternatively, there way have timers without using timer_create
, timerfd_create
. select
accepts timeout argument can used specify time till next timer expiry. then, select
returns 0 if timeout occurred. method applies other event demultiplexing apis, such poll
, epoll
.
Comments
Post a Comment