範例程式碼: #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 |