linux c 应用编程定时器函数

在 Linux C 应用编程中,对于多线程编程中的定时器函数使用,通常可以借助 pthread 库和系统提供的定时器相关的函数来实现。

首先,常见的定时器函数有 setitimer()alarm()setitimer() 函数可以更精确地设置定时器,它可以设置为 ITIMER_REAL(以实时时间递减)、ITIMER_VIRTUAL(以进程在用户态执行的时间递减)和 ITIMER_PROF(以进程在用户态和内核态执行的时间递减)三种模式。

cpp 复制代码
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <unistd.h>
#include <signal.h>
#include <time.h>

#define TIMER_INTERVAL_SEC 2

void timer_handler(union sigval sv)
{
    printf("Timer expired. Thread ID: %ld\n", pthread_self());
}

void* thread_function(void* arg)
{
    timer_t timer_id;

    struct sigevent sev;
    sev.sigev_notify = SIGEV_THREAD;
    sev.sigev_notify_function = timer_handler;
    sev.sigev_value.sival_ptr = &timer_id;

    timer_create(CLOCK_REALTIME, &sev, &timer_id);

    struct itimerspec its;
    its.it_interval.tv_sec = TIMER_INTERVAL_SEC;
    its.it_interval.tv_nsec = 0;
    its.it_value.tv_sec = 1;
    its.it_value.tv_nsec = 0;

    timer_settime(timer_id, 0, &its, NULL);

    while (1) {
        sleep(1);
    }

    timer_delete(timer_id);

    pthread_exit(NULL);
}

int main()
{
    pthread_t thread_id1, thread_id2;

    pthread_create(&thread_id1, NULL, thread_function, NULL);
    pthread_create(&thread_id2, NULL, thread_function, NULL);

    pthread_join(thread_id1, NULL);
    pthread_join(thread_id2, NULL);

    return 0;
}
cpp 复制代码
#include <stdio.h>
#include <time.h>
#include <signal.h>
#include <unistd.h>
#include <stdlib.h>

#define TIMER_SIG SIGRTMIN

void timer_handler(int sig, siginfo_t *si, void *uc) {
    // 定时器到期时被调用的处理函数
    printf("Timer fired!\n");
}

int main() {
    timer_t timerid;
    struct sigevent sev;
    struct itimerspec its;
    struct sigaction sa;

    // 设置处理函数
    sa.sa_flags = SA_SIGINFO;
    sa.sa_sigaction = timer_handler;
    sigemptyset(&sa.sa_mask);
    if (sigaction(TIMER_SIG, &sa, NULL) == -1) {
        perror("sigaction");
        exit(1);
    }

    // 创建定时器
    sev.sigev_notify = SIGEV_SIGNAL;
    sev.sigev_signo = TIMER_SIG;
    sev.sigev_value.sival_ptr = &timerid;
    if (timer_create(CLOCK_REALTIME, &sev, &timerid) == -1) {
        perror("timer_create");
        exit(1);
    }

    // 启动定时器
    its.it_value.tv_sec = 2; // 初次到期时间,2秒后
    its.it_value.tv_nsec = 0;
    its.it_interval.tv_sec = 1; // 定时器周期,每隔1秒
    its.it_interval.tv_nsec = 0;
    if (timer_settime(timerid, 0, &its, NULL) == -1) {
        perror("timer_settime");
        exit(1);
    }

    sleep(10); // 等待定时器触发几次
    return 0;
}
相关推荐
waicsdn_haha1 分钟前
Java/JDK下载、安装及环境配置超详细教程【Windows10、macOS和Linux图文详解】
java·运维·服务器·开发语言·windows·后端·jdk
嵌入式科普2 分钟前
十三、从0开始卷出一个新项目之瑞萨RZN2L串口DMA接收不定长
c语言·stm32·瑞萨·e2studio·rzn2l
_WndProc3 分钟前
C++ 日志输出
开发语言·c++·算法
qq_4335545412 分钟前
C++ 面向对象编程:+号运算符重载,左移运算符重载
开发语言·c++
数据小爬虫@31 分钟前
如何高效利用Python爬虫按关键字搜索苏宁商品
开发语言·爬虫·python
ZJ_.33 分钟前
WPSJS:让 WPS 办公与 JavaScript 完美联动
开发语言·前端·javascript·vscode·ecmascript·wps
Narutolxy39 分钟前
深入探讨 Go 中的高级表单验证与翻译:Gin 与 Validator 的实践之道20241223
开发语言·golang·gin
Hello.Reader1 小时前
全面解析 Golang Gin 框架
开发语言·golang·gin
禁默1 小时前
深入浅出:AWT的基本组件及其应用
java·开发语言·界面编程
Code哈哈笑1 小时前
【Java 学习】深度剖析Java多态:从向上转型到向下转型,解锁动态绑定的奥秘,让代码更优雅灵活
java·开发语言·学习