>как pselect использует struct timespec (с секундами и наносекундами).
>Или наносекунд тоже мало? :)
Дело не в иочности select а в том, что этот таймаут уже используется для других целей. Поэтому нужен процесс, который бы будил наш select по условию.
Реализовал в виде класса на основе pthread. Работает.//----------------------------- CTimer --------------------------------------
//
CTimer::CTimer(int _Interval):
Interval(_Interval), SyncPipe(0,O_NONBLOCK) {
}
void CTimer::Enable(bool Yes) {
if (Yes) Resume() ; else Terminate() ;
}
void CTimer::AfterTic() { char C ; TryRead(SyncPipe.RFd(),&C,1,"CTimer::AfterTic") ; }
void *CTimer::Execute() {
while (!Terminated) { fd_set ReadFds ; FD_ZERO(&ReadFds) ;
FD_SET(EndThreadPipe.RFd(),&ReadFds) ;
int MaxFd=EndThreadPipe.RFd() ; MaxFd+=1 ;
timeval TimeOut ; TimeOut.tv_sec=Interval/1000 ; TimeOut.tv_usec=(Interval*1000)%1000 ; // Период пилот сигнала
int Ret=select(MaxFd,&ReadFds,NULL,NULL,&TimeOut) ;
if (Terminated) break ;
if (Ret>0) {
} else if (Ret==0) { // Таймаут
char C ; TryWrite(SyncPipe.WFd(),&C,1,"CTimer::Execute() Таймаут") ;
} else { int Err=errno ;
if (Err!=EINTR) errmsgerrno("CTimer::Execute Ошибка Select") ;
}
}
return NULL ;
}