gpt4 book ai didi

c - timer_create() 无法捕获处理程序函数中的信号

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:24:03 26 4
gpt4 key购买 nike

我在这里尝试实现一个计时器,比如 0-10 秒和每个 2 秒的间隔,这样我需要每 2 秒(总共 5 次)生成一个中断,表示 2 秒已完成。我一直在使用 printf() 交叉检查 handler() 函数。但是我无法达到预期的结果。如果有人知道,请联系我。

提前致谢。

#include <stdlib.h>
#include <unistd.h>
#include <stdio.h>
#include <signal.h>
#include <time.h>
#define SIGTIMER (SIGRTMAX)
#define errExit(msg) do { perror(msg); exit(EXIT_FAILURE); \
} while (0)



void handler(int sig, siginfo_t *si, void *uc)
{
printf("Caught signal %d\n", sig);

}

int
main(int argc, char *argv[])
{
timer_t timerid;
struct sigevent sev;
struct itimerspec its;
struct itimerspec oitval;

struct sigaction sa;

/* Establish handler for timer signal */

printf("Establishing handler for signal %d\n", SIGTIMER);
sa.sa_flags = SA_SIGINFO;
sa.sa_sigaction = handler;
sigemptyset(&sa.sa_mask);
if (sigaction(SIGTIMER, &sa, NULL) == -1)
errExit("sigaction");

/* Create the timer */

sev.sigev_notify = SIGEV_SIGNAL;
sev.sigev_signo = SIGTIMER;
sev.sigev_value.sival_ptr = &timerid;
if (timer_create(CLOCK_REALTIME, &sev, &timerid) == 0)
{
printf("timer ID is 0x%lx\n", (long) timerid);

/* Start the timer */

its.it_value.tv_sec = 10;
its.it_value.tv_nsec =0;
its.it_interval.tv_sec = 2;
its.it_interval.tv_nsec = 0;

if (timer_settime(timerid, 0, &its, &oitval) == -1)
errExit("timer_settime");
}
else
{
errExit("timer_create");
}

return 0;
}

最佳答案

首先你应该正确设置超时:

       /* Start the timer */

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

it_value 是第一次触发前的持续时间,it_interval 是所有后续触发之间的时间。参见 here .然后,您不应该从 main() 返回,因为它会导致进程退出并且您将无法观察到计时器滴答声。您需要以某种方式阻止执行,例如

while(1) sleep(INT_MAX);

在每次滴答后,sleep() 返回,errno 设置为 EINTR,因此我们应该将其包装到循环中以允许计时器继续运行。稍后您可以决定何时离开此循环并退出。

附言从信号处理程序使用 printf() 不是一个好主意。你应该非常小心你在那里做什么。最好只写入某个全局变量并立即返回。并且可以在 sleep() 之后立即测试该 var,让您知道是否应该再次 sleep 或返回。

关于c - timer_create() 无法捕获处理程序函数中的信号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38264021/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com