2016-12-25 30 views
0

我需要在我的代码中使用一些定时器。我有这样的事情:Linux定时器CLOCK_PROCESS_CPU_ID不起作用

struct sigevent ec; 

    ec.sigev_notify = SIGEV_THREAD; 
    ec.sigev_value.sival_ptr = &c_timer; 
    ec.sigev_notify_function = c_thread; 
    ec.sigev_notify_attributes = NULL; 

    secs = floor(c); 
    nsecs = (long long) SECOND * (c - secs); 
    printf("%ds\t%lldns\n\n",secs,nsecs); 
    it1c.it_value.tv_sec = secs; 
    it1c.it_value.tv_nsec = nsecs; 
    it1c.it_interval.tv_sec = 0; 
    it1c.it_interval.tv_nsec = 0; 

    timer_create(CLOCK_PROCESS_CPUTIME_ID, &ec, &c_timer); 
    timer_settime(c_timer, 0, &it1c, NULL); 

哪里c_thread是一些简单的函数,它是设置新的计时器,第二个是:

#define SECOND 1000000000 

c是类似2.25

而且我的问题是该计时器在它应该时不会调用c_thread。当我将CLOCK_PROCESS_CPUTIME_ID更改为CLOCK_REALTIME时,一切正常,并且被调用,但是当我使用第一个时没有任何反应。我还使用其他具有clock_gettime函数的CLOCK_REALTIME计时器检查CLOCK_PROCESS_CPUTIME_ID,并且时钟值达到我的it_value。

任何想法可能是错的?

而我的第二个问题:是否有任何方法将某些参数传递给使用定时器称为线程的函数?

+0

请给出一个[MCVE]。 'CPUTIME'指示进程消耗多少CPU时间(说明明显)。如果你的程序进入休眠状态,那么它将永远达不到2.5秒的CPU时间。所以我们需要在设置定时器之后看看程序还有什么功能。 – kaylum

回答

2

@annamataris问题与spinlock和nanosleep的东西无关。有理由仅使用CLOCK_REALTIME,因为。

POSIX定时器系统调用首先出现在Linux 2.6中。在 之前,glibc使用POSIX线程提供了不完整的用户空间实现 (仅限CLOCK_REALTIME计时器),在2.17之前版本的glibc 版本中,在运行2.6版之前的Linux内核的系统上,该实现退回到此技术 。

阅读man timer_create欲了解更多信息。