Linux 中用户态C++定时器的使用
在Linux中,timer_create
函数可以使用不同的时钟选项来创建定时器。主要的时钟选项有以下几种:
- CLOCK_REALTIME
- CLOCK_MONOTONIC
- CLOCK_PROCESS_CPUTIME_ID
- CLOCK_THREAD_CPUTIME_ID
- CLOCK_BOOTTIME
- CLOCK_REALTIME_ALARM
- CLOCK_BOOTTIME_ALARM
1. CLOCK_REALTIME
- 用途:基于系统实时时钟。这个时钟可以被系统时间的改变所影响(例如通过
settimeofday
或NTP同步)。 - 用法:通常用于需要知道真实时间的应用。
timer_create(CLOCK_REALTIME, &sev, &timerId);
2. CLOCK_MONOTONIC
- 用途:单调递增时钟。这个时钟不会受到系统时间改变的影响,适合测量时间间隔。
- 用法:适用于需要稳定时间间隔的应用,如测量程序运行时间。
timer_create(CLOCK_MONOTONIC, &sev, &timerId);
3. CLOCK_PROCESS_CPUTIME_ID
- 用途:用于测量调用进程的CPU时间。
- 用法:适合用于需要精确测量某个进程CPU使用时间的应用。
timer_create(CLOCK_PROCESS_CPUTIME_ID, &sev, &timerId);
4. CLOCK_THREAD_CPUTIME_ID
- 用途:用于测量调用线程的CPU时间。
- 用法:适合用于需要精确测量某个线程CPU使用时间的应用。
timer_create(CLOCK_THREAD_CPUTIME_ID, &sev, &timerId);
5. CLOCK_BOOTTIME
- 用途:类似于
CLOCK_MONOTONIC
,但包括系统睡眠时间。 - 用法:适合需要知道系统运行总时间(包括睡眠时间)的应用。
timer_create(CLOCK_BOOTTIME, &sev, &timerId);
6. CLOCK_REALTIME_ALARM
- 用途:类似于
CLOCK_REALTIME
,但用于唤醒系统或发出警报。 - 用法:适合用于需要在特定时间唤醒系统的应用。
timer_create(CLOCK_REALTIME_ALARM, &sev, &timerId);
7. CLOCK_BOOTTIME_ALARM
- 用途:类似于
CLOCK_BOOTTIME
,但用于唤醒系统或发出警报。 - 用法:适合用于需要在特定时间唤醒系统且包括睡眠时间的应用。
timer_create(CLOCK_BOOTTIME_ALARM, &sev, &timerId);
示例代码
以下是使用CLOCK_MONOTONIC
时钟选项的示例代码:
#include <iostream>
#include <signal.h>
#include <time.h>
#include <unistd.h>// 定时器触发的处理函数
void timerHandler(int sig, siginfo_t *si, void *uc) {struct timespec ts;clock_gettime(CLOCK_MONOTONIC, &ts);std::cout << "Timer triggered! Current time: " << ts.tv_sec << " seconds and " << ts.tv_nsec << " nanoseconds" << std::endl;
}int main() {struct sigaction sa;sa.sa_flags = SA_SIGINFO;sa.sa_sigaction = timerHandler;sigemptyset(&sa.sa_mask);sigaction(SIGRTMIN, &sa, NULL);timer_t timerId;struct sigevent sev;sev.sigev_notify = SIGEV_SIGNAL;sev.sigev_signo = SIGRTMIN;sev.sigev_value.sival_ptr = &timerId;timer_create(CLOCK_MONOTONIC, &sev, &timerId);struct itimerspec its;its.it_value.tv_sec = 1;its.it_value.tv_nsec = 0;its.it_interval.tv_sec = 1;its.it_interval.tv_nsec = 0;timer_settime(timerId, 0, &its, NULL);sleep(5); // 主线程休眠5秒timer_delete(timerId); // 停止定时器return 0;
}
您可以根据需要选择合适的时钟选项,并将其替换到代码中的timer_create
函数中。