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;
}
相关推荐
同学小张7 小时前
【端侧AI 与 C++】1. llama.cpp源码编译与本地运行
开发语言·c++·aigc·llama·agi·ai-native
踢球的打工仔8 小时前
PHP面向对象(7)
android·开发语言·php
汤姆yu10 小时前
基于python的外卖配送及数据分析系统
开发语言·python·外卖分析
Yue丶越10 小时前
【C语言】字符函数和字符串函数
c语言·开发语言·算法
翔云 OCR API11 小时前
人脸识别API开发者对接代码示例
开发语言·人工智能·python·计算机视觉·ocr
V***u45311 小时前
MS SQL Server partition by 函数实战二 编排考场人员
java·服务器·开发语言
这是程序猿11 小时前
基于java的ssm框架旅游在线平台
java·开发语言·spring boot·spring·旅游·旅游在线平台
芳草萋萋鹦鹉洲哦11 小时前
【elemen/js】阻塞UI线程导致的开关卡顿如何优化
开发语言·javascript·ui
爱学习的小邓同学11 小时前
C++ --- 多态
开发语言·c++
颜*鸣&空12 小时前
QT实现串口通信+VSPD+串口调试工具
开发语言·qt