【问题标题】:Understanding struct itimerval field tv_usec了解 struct itimerval 字段 tv_usec
【发布时间】:2018-01-02 17:00:05
【问题描述】:

嗨,我正在研究这段代码:

#include <signal.h>
#include <stdio.h>
#include <string.h>
#include <sys/time.h>
#include <unistd.h>
#include <stdlib.h>
#include <stdbool.h>


volatile sig_atomic_t print_flag = true;
static int count = 0;

void timer_handler (int signum)
{

 printf ("timer expired %d times\n", ++count);
 if(count>20) {
    print_flag = false;
 } 
}

int main ()
{
 struct sigaction sa;
 struct itimerval timer;

 /* Install timer_handler as the signal handler for SIGVTALRM. */
 memset (&sa, 0, sizeof (sa));
 sa.sa_handler = &timer_handler;
 sigaction (SIGALRM, &sa, NULL);

 /* Configure the timer to expire after 250 msec... */
 timer.it_value.tv_sec = 0;
 timer.it_value.tv_usec = 250000;
 /* ... and every 250 msec after that. */
 timer.it_interval.tv_sec = 0;
 timer.it_interval.tv_usec = 250000;
 /* Start a virtual timer. It counts down whenever this process is
   executing. */
 setitimer (ITIMER_REAL, &timer, NULL);

 /* Do busy work. */
 while (print_flag) {
    sleep(1);
 }

printf("job done bye bye\n");
    exit(0);

}

有了这个设置,一切都很好,我得到了这个输出

...
timer expired 17 times
timer expired 18 times
timer expired 19 times
timer expired 20 times
timer expired 21 times
job done bye bye

如果我尝试更改注释timer.it_interval.tv_usectimer.it_interval.tv_usec 的代码并将timer.it_value.tv_sectimer.it_value.tv_sec 设置为例如3,它就无法完成他的工作。

但是,如果我像这样维护tv_usec 的显式声明,它会起作用:

 timer.it_value.tv_sec = 3;
 timer.it_value.tv_usec = 0;
 timer.it_interval.tv_sec = 3;
 timer.it_interval.tv_usec = 0;

为什么我在两个字段的 tv_usec 的显式声明上绑定?

【问题讨论】:

  • 这可能不是您的麻烦的原因,但请参阅How to avoid using printf() in a signal handler 以获取有关您可以在信号处理程序中调用哪些函数的信息。请注意,printf() 不是这些函数之一,正式的(strlen() 也不是——虽然我可以解释 printf(),但我发现 strlen() 更难解释)。
  • 谢谢我完全忘记了!

标签: c linux unix signals setitimer


【解决方案1】:

只要您不初始化*.tv_usec 字段,它们的值就是未定义。如果它包含大于999999 或小于0 的值,则setitimer () 将按照手册页中的说明以EINVAL 失败。

您应该自己初始化所有数据。如果您愿意节省一行代码,您可以将memset timer 结构体转换为0,就像您为sa 所做的那样。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-01-25
    • 2016-07-02
    • 2014-10-28
    • 1970-01-01
    • 2020-04-02
    • 2011-06-30
    • 1970-01-01
    • 2017-06-09
    相关资源
    最近更新 更多