示例代码:
#include <iostream> using namespace std; #include <pthread.h> #include <unistd.h> #include <stdlib.h> #include <signal.h> #include <pthread.h> #include <unistd.h> #include <sys/stat.h> #include <string.h> #include <time.h>
#define SIGMYTIMER (SIGRTMAX)
int SetTimer(int nElaspe , int nMode = 1); void TimerRoutine(int signo, siginfo_t* info, void* context);
int main() { cout<<"proc id: "<<(long)getpid()<<" main thread id:"<<pthread_self()<<endl;
struct sigaction sysact;
//setup signal handler sigemptyset(&sysact.sa_mask); sysact.sa_flags = SA_SIGINFO; sysact.sa_sigaction = TimerRoutine ; sigaction(SIGMYTIMER, &sysact, NULL);
SetTimer(500); SetTimer(500); SetTimer(500);
while(1) { sleep(1); } cout<<"quit!!!!"<<endl; return 0; }
timer_t IDList[20]; //use to save timer id;
//mode: 0: oneshot timer; 1: periodicity timer int SetTimer(int nElaspe, int nMode) { struct sigevent evp;
static int nTimerIndex = 0;
evp.sigev_notify = SIGEV_SIGNAL; evp.sigev_signo = SIGMYTIMER; evp.sigev_value.sival_ptr = &IDList[nTimerIndex]; int nCreate = timer_create(CLOCK_REALTIME, &evp, &IDList[nTimerIndex]);
if (nCreate == 0) //success { struct itimerspec value; struct itimerspec ovalue;
value.it_value.tv_sec = nElaspe / 1000; value.it_value.tv_nsec = (nElaspe % 1000) * (1000 * 1000);
if (nMode == 1) { value.it_interval.tv_sec = value.it_value.tv_sec; value.it_interval.tv_nsec = value.it_value.tv_nsec; } else { value.it_interval.tv_sec = 0; value.it_interval.tv_nsec = 0; }
if (timer_settime(IDList[nTimerIndex], 0, &value, &ovalue) == 0) //success { cout<<"Timer id:"<<IDList[nTimerIndex]<<" nElaspe:"<<nElaspe<<endl; } } else { cout<<"create timer error"<<endl; }
//++nTimerIndex; return IDList[nTimerIndex++]; }
//timer singal proc void TimerRoutine(int signo, siginfo_t* info, void* context) { if (signo != SIGMYTIMER) return;
//display time time_t currtime; time(&currtime); tm* pTm = localtime(&currtime); if (pTm) { char sBuf[30]; sprintf(sBuf, "%02d:%02d:%02d", pTm->tm_hour, pTm->tm_min, pTm->tm_sec); cout<<sBuf; }
cout<<" timer_id:"<<*(int*)(info->si_value.sival_ptr)<<" sig_id:"<<signo<<" thread_id:"<<pthread_self()<<endl; }
编译:
librt是一个系统库,你不必管他的路径(在usr/lib中),在编译时记得连接就行了。
g++ -o demo demo.cpp -lrt |