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;
}
相关推荐
㓗冽1 小时前
60题之内难题分析
开发语言·c++·算法
dingdingfish1 小时前
Bash学习 - 第3章:Basic Shell Features,第5节:Shell Expansions
开发语言·学习·bash
rainbow68891 小时前
C++开源库dxflib解析DXF文件实战
开发语言·c++·开源
deepxuan1 小时前
Day7--python
开发语言·python
禹凕1 小时前
Python编程——进阶知识(多线程)
开发语言·爬虫·python
蜡笔小马2 小时前
10.Boost.Geometry R-tree 空间索引详解
开发语言·c++·算法·r-tree
IOsetting2 小时前
金山云主机添加开机路由
运维·服务器·开发语言·网络·php
林开落L2 小时前
从零开始学习Protobuf(C++实战版)
开发语言·c++·学习·protobuffer·结构化数据序列化机制
牛奔2 小时前
Go 是如何做抢占式调度的?
开发语言·后端·golang
符哥20082 小时前
C++ 进阶知识点整理
java·开发语言·jvm