linux中创建一个循环定时器(C++)

可以定义一个类来封装定时器的功能,并将其分别放在 `.cpp` 和 `.h` 文件中。这里是一个简化的示例,展示了如何组织这些代码。

假设有一个 `Timer` 类,它负责创建和管理定时器。

Timer.h

#ifndef TIMER_H

#define TIMER_H

#include <signal.h>

#include <time.h>

#include <unistd.h>

class Timer {

public:

Timer();

~Timer();

void start();

void stop();

private:

static void timerCallback(int signum);

static struct sigaction sa;

static struct itimerspec its;

static timer_t timerId;

};

#endif // TIMER_H

```

Timer.cpp

#include "Timer.h"

struct sigaction Timer::sa;

struct itimerspec Timer::its;

timer_t Timer::timerId;

Timer::Timer() {

// 初始化定时器

sa.sa_handler = Timer::timerCallback;

sa.sa_flags = SA_RESTART;

if (sigaction(SIGRTMIN, &sa, NULL) == -1) {

perror("sigaction");

exit(1);

}

struct sigevent sev;

sev.sigev_notify = SIGEV_SIGNAL;

sev.sigev_signo = SIGRTMIN;

sev.sigev_value.sival_ptr = &Timer::timerId;

if (timer_create(CLOCK_REALTIME, &sev, &Timer::timerId) == -1) {

perror("timer_create");

exit(1);

}

its.it_value.tv_sec = 1; // 初始延迟一秒

its.it_value.tv_nsec = 0;

its.it_interval.tv_sec = 1; // 每秒触发

its.it_interval.tv_nsec = 0;

if (timer_settime(Timer::timerId, 0, &its, NULL) == -1) {

perror("timer_settime");

exit(1);

}

}

Timer::~Timer() {

// 销毁定时器

timer_delete(Timer::timerId);

}

void Timer::start() {

while (true) {

pause(); // 等待信号

}

}

void Timer::stop() {

// 停止定时器

timer_settime(Timer::timerId, 0, &its, NULL);

}

void Timer::timerCallback(int signum) {

static int count = 0;

printf("Timer callback called! Count: %d\n", ++count);

}

```

main.cpp

#include "Timer.h"

int main() {

Timer timer;

timer.start();

// 其他代码...

return 0;

}

```

`Timer.h` 包含了 `Timer` 类的声明,`Timer.cpp` 实现了类的方法,包括定时器的创建、启动和停止,以及回调函数。`main.cpp` 中包含了主函数,它实例化 `Timer` 对象并开始定时器。

使用时需要注意信号的安全性和正确性。

相关推荐
恒创科技HK18 小时前
香港100G高防服务器的防御力如何?
运维·服务器
Hoxy.R18 小时前
iSCSI 磁盘扩容后节点不刷新容量的问题解决(StarWind + Linux)
linux·运维·服务器
CV小白进阶路18 小时前
【无标题】Vscode 报错 got bad result from install script无法远程链接服务器
服务器·ide·vscode
lytao12318 小时前
使用 dnsmasq 搭建本地 DNS 服务器完整指南
运维·服务器·dns
心随雨下18 小时前
Tomcat日志配置与优化指南
java·服务器·tomcat
wljt18 小时前
Linux 常用命令速查手册(Java开发版)
java·linux·python
riderxin18 小时前
【20251028】固定Ubuntu的IP地址
linux·tcp/ip·ubuntu
赖small强18 小时前
Linux 内核 8 类同步机制详解(原理、场景与示例)
linux·信号量·原子操作·自旋锁·内核同步方法·读-写自旋锁·读-写信号量
卡提西亚18 小时前
C++笔记-21-运算符重载
c++·笔记
YJlio19 小时前
PsService·下(7.21):Find/SetConfig 与服务的启动/停止/重启/暂停/恢复
linux·运维·服务器