【问题标题】:Passing user data with timer_create使用 timer_create 传递用户数据
【发布时间】:2011-08-22 06:55:22
【问题描述】:

我正在使用timer_create 在 Linux 中创建一个计时器。回调原型为:

static void TimerHandlerCB(int sig, siginfo_t *extra, void *cruft)

如何传递用户数据,以便在计时器到期后调用的回调中接收相同的数据。

这是我的示例代码:

int RegisterTimer(iDiffInTime)
{
    struct sigaction sa; 
    sigemptyset(&sa.sa_mask);
    sa.sa_flags = SA_SIGINFO;   /*call our handler*/
    sa.sa_sigaction = TimerHandlerCB;/*Event handler to be called after timer expires*/ 
    if(sigaction(SIGRTMAX, &sa, NULL) < 0)
    {
        perror("sigaction");
        return 1;
    }
    // Setup the timer
    sigevent sigev;
    timer_t timerid = 0;

    memset(&sigev, 0, sizeof(sigev));

    sigev.sigev_notify          = SIGEV_SIGNAL;
    sigev.sigev_signo           = SIGRTMAX;
    sigev.sigev_value.sival_ptr = &timerid;

    timer_t timerid;

    if (timer_create(CLOCK_REALTIME, &sigev, &timerid) == 0)
    {
        printf("Timer created\n");
        struct itimerspec itval, oitval;

        itval.it_value.tv_sec = iDiffInTime * 1000;
        itval.it_value.tv_nsec = 0;
        itval.it_interval.tv_sec = 0;
        itval.it_interval.tv_nsec = 0;

              //Populate handles required in TimerCallback
              Display_Handle hDisplay = ......//
              Buffer_Handle hBuf = .....//
        if (timer_settime(timerid, 0, &itval, &oitval) != 0)
        {
            perror("time_settime error!");
            return 1;
        }
    } 
    else 
    {
        perror("timer_create error!");
    }
    return 0
}

我应该将hDisplayhBuf 传递到哪里,以便我可以在TimerHandlerCB 中接收它们?

【问题讨论】:

  • @Tomalak Geret'kal:它是带有程序 C++ 的遗留代码;)
  • .sival_ptr 设置为局部变量的地址可能不是一个好主意。

标签: c++ c linux timer posix


【解决方案1】:

你已经在做:

sigev.sigev_value.sival_ptr = &timerid;

您可以在其中指定任何内容(指定&amp;timerid 是常见的区分多个计时器但不是必需的)。现在在你的处理程序中:

static void timer_handler(int signo, siginfo_t *si, void *uc)
{
    /* si->si_value.sival_ptr */
}

来自 TLPI 的报价

调用 timer_create() 时, evp.sigev_value.sival_ptr 通常是 分配了timerid的地址 在同一个调用中给出的参数。 或者, evp.sigev_value.sival_ptr 可能是 分配了结构的地址 包含给定的timerid timer_create()

【讨论】:

  • 谢谢,这是我需要的:)
【解决方案2】:

您需要:

  • 添加全局变量并使用信号量等同步机制
  • 使用sigqueue

【讨论】:

    猜你喜欢
    • 2011-06-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-07
    • 1970-01-01
    • 2013-06-21
    相关资源
    最近更新 更多