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` 对象并开始定时器。

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

相关推荐
TG:@yunlaoda360 云老大10 小时前
华为云国际站代理商NAT的规格有哪些?
服务器·网络·华为云
hkNaruto10 小时前
【C++】记录一次C++程序编译缓慢原因分析——滥用stdafx.h公共头文件
开发语言·c++
Guheyunyi11 小时前
视频安全监测系统的三大核心突破
大数据·运维·服务器·人工智能·安全·音视频
石像鬼₧魂石11 小时前
HexStrike AI 理想操作流程清单(完整功能版)
linux·人工智能·windows·学习·ubuntu
Xの哲學11 小时前
Linux UPnP技术深度解析: 从设计哲学到实现细节
linux·服务器·网络·算法·边缘计算
柏木乃一11 小时前
进程(6)进程切换,Linux中的进程组织,Linux进程调度算法
linux·服务器·c++·算法·架构·操作系统
Jelly-小丑鱼11 小时前
Linux搭建SQLserver数据库和Orical数据库
linux·运维·数据库·sqlserver·oracal·docker容器数据库
CAU界编程小白11 小时前
Linux编程系列之权限理解和基础开发工具的使用(下)
linux
Run_Teenage11 小时前
Linux:进程等待
linux·运维·服务器
Trouvaille ~11 小时前
【Linux】从磁盘到文件系统:深入理解Ext2文件系统
linux·运维·网络·c++·磁盘·文件系统·inode