【问题标题】:Non blocking timer in linux user space (in C)linux用户空间中的非阻塞计时器(在C中)
【发布时间】:2012-05-10 16:03:16
【问题描述】:

实际上我想实现非阻塞计时器,当计时器到期时,将调用处理程序并执行某些操作(现在它打印数据)。我谷歌并意识到timer_createtimer_settimer 是非阻塞计时器。但是我仍然有问题,我必须等待我的计时器到期(sleep(MAX)while(1) {;})。但是,如果我用不同的“到期”时间调用我的 start_timer 方法,它应该相应地工作,不应该阻止其他。例如这里我第一次调用计时器,并期望在 5 秒内调用处理程序,但在第二次调用之前应该打印它的数据,我给出的间隔仅为 1 秒。当然,它的行为也不一样。有什么想法吗?

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

typedef struct _data{
    char *name;
}data;


void handler(union sigval val)
{
    data *data_handler = val.sival_ptr;
    printf("Handler entered with value :%s\n", data_handler->name);
}

void mod_timer(timer_t timerid, struct sigevent sig, struct itimerspec in, struct itimerspec out)
{
    printf("mod_timer\n");
    timer_settime(timerid, 0, &in, &out);
    while(1)
        sleep(1);
    //delete the timer.
    timer_delete(timerid);
}

void start_timer(void* val, int interval)
{
    int Ret;
    pthread_attr_t attr;
    pthread_attr_init( &attr );

    struct sched_param parm;
    parm.sched_priority = 255;
    pthread_attr_setschedparam(&attr, &parm);

    struct sigevent sig;
    sig.sigev_notify = SIGEV_THREAD;
    sig.sigev_notify_function = handler;
//    sig.sigev_value.sival_int = val;
    sig.sigev_value.sival_ptr = val;
    sig.sigev_notify_attributes = &attr;

//create a new timer.
    timer_t timerid;
    Ret = timer_create(CLOCK_REALTIME, &sig, &timerid);
    if (Ret == 0)
    {
        struct itimerspec in, out;
        in.it_value.tv_sec = 1;
        in.it_value.tv_nsec = 0;
        in.it_interval.tv_sec = interval;
        in.it_interval.tv_nsec = 0;

       mod_timer(timerid, sig, in, out);
    }
}

void main()
{
//    start_timer(1, 5);
//    start_timer(2, 1);
    data handler_data1 = {"Handler Data 1"};
    data handler_data2 = {"Handler Data 2"};
    void *data1 = &handler_data1;
    void *data2 = &handler_data2;
    start_timer(data1, 5);
    start_timer(data2, 1);
}

【问题讨论】:

  • 为什么不给定时器一个单独的线程?
  • 这段代码的目标是什么?这似乎更像是一个设计缺陷而不是计时器问题。
  • @Dave 是的,不完全是计时器问题,我的目标是正如我所说,我想在“间隔”延迟之后执行处理程序(执行任务)。例如,从这段代码中,data1 应该在 5 秒后执行,data2 应该在 1 秒后执行。即,一旦我在 1 秒内开始执行,data2 将被执行,再过 4 秒,data1.
  • @noMAD 你能详细说明一下吗,可能一些伪代码会有所帮助
  • @noMAD,我尝试使用线程,在 start_timer 和线程方法中创建线程作为 mod_timer,但仍然在 start_timer 中我必须执行 pthread_join(thread_id),对吗?所以这再次暂停了其他调用的执行。 (这里是数据2)。 :(((

标签: c timer sleep signals nonblocking


【解决方案1】:

您可以使用alarm 函数生成信号,并使用signal 函数指定该信号的处理程序。

【讨论】:

  • 问题是关于如何使用timer_notalarm。警报也将 sec 作为参数。如果用户需要 1.1234567 秒怎么办?
猜你喜欢
  • 1970-01-01
  • 2014-06-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多