linux c++定时器任务代码设计
时间: 2023-07-29 10:10:48 浏览: 58
在Linux C++中,可以使用定时器来实现定时任务。下面是一个简单的定时器任务实现的示例代码:
```c++
#include <sys/timerfd.h>
#include <unistd.h>
#include <cstring>
#include <cstdint>
#include <functional>
#include <iostream>
class Timer {
public:
Timer() : fd_(-1) {}
bool Start(uint64_t interval_ms, std::function<void()> callback) {
if (fd_ != -1) {
std::cerr << "Timer has already started\n";
return false;
}
fd_ = timerfd_create(CLOCK_MONOTONIC, TFD_NONBLOCK);
if (fd_ == -1) {
perror("timerfd_create");
return false;
}
struct itimerspec ts;
ts.it_value.tv_sec = interval_ms / 1000;
ts.it_value.tv_nsec = (interval_ms % 1000) * 1000000;
ts.it_interval.tv_sec = ts.it_value.tv_sec;
ts.it_interval.tv_nsec = ts.it_value.tv_nsec;
if (timerfd_settime(fd_, 0, &ts, NULL) == -1) {
perror("timerfd_settime");
close(fd_);
fd_ = -1;
return false;
}
callback_ = callback;
return true;
}
void Stop() {
if (fd_ != -1) {
close(fd_);
fd_ = -1;
}
}
void HandleEvent() {
uint64_t expirations = 0;
ssize_t n = read(fd_, &expirations, sizeof(expirations));
if (n == -1) {
perror("read");
return;
}
callback_();
}
private:
int fd_;
std::function<void()> callback_;
};
// 示例用法
int main() {
Timer timer;
timer.Start(1000, []() {
std::cout << "Timer expired\n";
});
sleep(5);
timer.Stop();
return 0;
}
```
在上面的代码中,Timer类封装了一个基于timerfd的定时器。Start函数用于启动定时器,interval_ms参数指定了定时器的间隔时间(毫秒),callback参数指定了定时器到期时要执行的回调函数。Stop函数用于停止定时器。HandleEvent函数用于处理定时器事件,即读取定时器文件描述符上的数据,然后执行回调函数。注意,定时器事件会一直触发,直到定时器被停止。