Linux C创建两个定时器分别执行不同的回调函数
时间: 2024-09-10 11:15:07 浏览: 63
linux多定时器多线程
在Linux中,你可以使用`timerfd_create()`函数结合信号量、互斥锁等机制来创建定时器,并通过注册不同的回调函数执行不同的任务。以下是一个简单的步骤概述:
1. **创建定时器文件描述符**:
使用`timerfd_create(CLOCK_MONOTONIC, TFD_CLOEXEC)`创建一个无中断的定时器,`CLOCK_MONOTONIC`表示时间从系统启动以来持续的时间。
```c
int timer_fd[2];
if (fcntl(timer_fd[0], F_SETFL, O_NONBLOCK) < 0) {
perror("fcntl");
}
if (timerfd_create(CLOCK_MONOTONIC, TFD_CLOEXEC | TFD_NONBLOCK, &timer_fd[1]) < 0) {
perror("timerfd_create");
}
```
2. **设置定时器超时**:
使用`ioctl()`函数将定时器设置为特定延迟,并关联一个回调。这通常涉及到编写一个结构体,如`itimerval`或`itimerspec`,并传递给`timerfd_settime()`。
```c
struct itimerspec spec;
spec.it_value.tv_sec = seconds; // 定义秒数部分
spec.it_value.tv_nsec = nanoseconds; // 定义纳秒部分
spec.it_interval.tv_sec = interval_seconds;
spec.it_interval.tv_nsec = interval_nanos;
if (ioctl(timer_fd[1], TIOCMBIT, &TIFeltaspec) != 0) {
perror("ioctl");
}
if (timerfd_settime(timer_fd[1], 0, &spec, NULL) < 0) {
perror("timerfd_settime");
}
```
3. **关联回调函数**:
每个定时器需要有一个回调函数,这个函数会在指定时间到达时被执行。例如,可以使用`sigaction()`设置一个SIGEV_TIMER信号处理器来关联回调:
```c
void callback1(int fd) {
// 执行第一个回调任务
}
void callback2(int fd) {
// 执行第二个回调任务
}
sigset_t mask;
sigemptyset(&mask);
sigaddset(&mask, SIGEV_TIMER);
struct sigevent sev;
sev.sigev_notify = SIGEV_SIGNAL;
sev.sigev_signo = SIGINT; // 只是为了示例,实际应替换为你的回调标识
sev.sigev_value.sival_ptr = (void*)callback1; // 或者 callback2
if (timerfd_setevents(timer_fd[1], 0, &mask, &sev, NULL) < 0) {
perror("timerfd_setevents");
}
```
4. **处理信号**:
最后,你需要设置一个信号处理器来接收定时器到期的信号。在这个处理器中,根据回调地址执行相应的任务。
5. **注意资源管理**:
当不再需要定时器时,记得关闭文件描述符以及解除相关的信号处理器。
阅读全文