POSIX定时器

在Linux下,我们可以使用POSIX提供的函数来创建定时器

int timer_create(clockid_t clockid, struct sigevent *sevp, timer_t *timerid);

clockid说明定时器是基于哪个时钟的,可以是下面的几个值:

CLOCK_REALTIME

CLOCK_MONOTONIC

CLOCK_PROCESS_CPUTIME_ID

CLOCK_THREAD_CPUTIME_ID

sevp设置了定时器到期的行为,通过sevp->sigev_notify进行设置:

SIGEV_SIGNAL:发送由evp->sigev_sino指定的信号到调用进程,evp->sigev_value的值将被作为siginfo_t结构体中si_value的值。

SIGEV_NONE:什么都不做,只提供通过timer_gettime和timer_getoverrun查询超时信息。

SIGEV_THREAD:以evp->sigev_notification_attributes为线程属性创建一个线程,在新建的线程内部以evp->sigev_value为参数调用evp->sigev_notification_function。

SIGEV_THREAD_ID:定时器到期时将向指定线程发送信号。

下面是两个基于SIGEV_SIGNAL和SIGEV_THREAD的例子:


/*
 * main.cpp
 *
 *  Created on: 2014年11月9日
 *      Author: Richard
 */

#include <pthread.h>
#include <stdio.h>
#include <time.h>
#include <signal.h>

int Count = 0;

void signal_catcher(int signo)
{
    Count++;
    printf("Catch a signal %d\n", signo);
}

int main(int argc, char **argv) {
    struct sigevent sig_event;
    struct sigaction sig_action;
    sigset_t sig_mask;
    timer_t timer_id;
    struct itimerspec timer_val;

    //Set up a repeating timer using signal number SIGRTMIN,
    //set to occur every 2 seconds.
    sig_event.sigev_value.sival_int = 0;
    sig_event.sigev_signo = SIGRTMIN;
    sig_event.sigev_notify = SIGEV_SIGNAL;

    //create timer
    timer_create(CLOCK_REALTIME, &sig_event, &timer_id);

    sigemptyset(&sig_mask);
    sigaddset(&sig_mask, SIGRTMIN);
    sig_action.sa_handler = signal_catcher;
    sig_action.sa_mask = sig_mask;
    sig_action.sa_flags = 0;

    sigaction(SIGRTMIN, &sig_action, NULL);

    timer_val.it_interval.tv_sec = 2;
    timer_val.it_interval.tv_nsec = 0;
    timer_val.it_value.tv_sec = 2;
    timer_val.it_value.tv_nsec = 0;

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

    while(1)
    {
        if (Count >= 5) {
            timer_settime(timer_id, 0, NULL, NULL);
            break;
        }
    }

    timer_delete(timer_id);

    return 0;
}

/*
 * main.cpp
 *
 *  Created on: 2014年11月9日
 *      Author: Richard
 */

#include <pthread.h>
#include <stdio.h>
#include <time.h>
#include <signal.h>

int Count = 0;

void TimerThread(sigval_t sig)
{
    int signo = sig.sival_int;
    char *Content = (char *)sig.sival_ptr;

    printf("signo: %d ,content: %s\n", signo, Content);
    Count++;
}

int main(int argc, char **argv) {
    struct sigevent sig_event;
    timer_t timer_id;
    struct itimerspec timer_val;

    sig_event.sigev_notify = SIGEV_THREAD;
    sig_event.sigev_value.sival_ptr=(void *)"Timer test";
    sig_event.sigev_notify_function = TimerThread;
    sig_event.sigev_notify_attributes = NULL;


    //create timer
    timer_create(CLOCK_REALTIME, &sig_event, &timer_id);

    timer_val.it_interval.tv_sec = 2;
    timer_val.it_interval.tv_nsec = 0;
    timer_val.it_value.tv_sec = 2;
    timer_val.it_value.tv_nsec = 0;

    timer_settime(timer_id, 0, &timer_val, NULL);
    while(1)
    {
        if (Count >= 5) {
            timer_settime(timer_id, 0, NULL, NULL);
            break;
        }
    }

    timer_delete(timer_id);
    return 0;
}
五次之后停止定时器,在返回前删除定时器。

POSIX定时器库中,有三个主要的函数用于操作定时器,它们分别是timer_create()、timer_settime()和timer_delete()。 这些函数可以帮助我们创建定时器、设置定时器的时间和操作定时器的删除。 此外,POSIX定时器库还提供了一套API来处理定时器事件。通过产生一个sigevent事件,来通知进程定时器事件的产生。这样,我们可以在定时器到期时执行一些特定的操作。 在POSIX定时器库中,我们还可以使用CLOCK_REALTIME时钟,它是一个系统范围的实时时钟。基于这个时钟的定时器可以在处理器处于省电模式时唤醒处理器并触发相应的事件。 通过使用这些函数和时钟,我们可以实现各种定时器功能。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [POSIX 定时器](https://blog.youkuaiyun.com/Little_Eyelash/article/details/117918411)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [POSIX定时器](https://blog.youkuaiyun.com/m0_52152959/article/details/110354542)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值