我正在为一个项目使用posix计时器函数,示例来自timer_create((man.
该代码与示例基本相同,从建立计时器信号的处理程序开始。
struct sigaction whohas_sa;
// establish handler
whohas_sa.sa_flags = SA_SIGINFO;
whohas_sa.sa_sigaction = whohas_timer_handler;
sigemptyset(&whohas_sa.sa_mask);
if (sigaction(SIG_WHOHAS, &whohas_sa, NULL) == -1)
errExit("sigaction whohas");
然后我有两个功能来创建和设置计时器。
void set_start_timer(timer_t timerid, int freq_secs)
{
// set and start the timer
struct itimerspec its;
its.it_value.tv_sec = freq_secs;
its.it_value.tv_nsec = 0;
its.it_interval.tv_sec = freq_secs;
its.it_interval.tv_nsec = 0;
if (timer_settime(timerid, 0, &its, NULL) == -1)
{
DPRINTF(4, "settimer failed! n");
errExit("timer_settime");
}
DPRINTF(4, "leave set timern");
}
void create_timer(int SIGNAL, timer_t timerid)
{
DPRINTF(4, "create timern");
sigset_t mask;
// block timer signal temporarily
sigemptyset(&mask);
sigaddset(&mask, SIGNAL);
if (sigprocmask(SIG_SETMASK, &mask, NULL) == -1)
errExit("sigprocmask");
// create the timer
struct sigevent sev;
sev.sigev_notify = SIGEV_SIGNAL;
sev.sigev_signo = SIGNAL;
sev.sigev_value.sival_ptr = &timerid;
if (timer_create(CLOCKID, &sev, &timerid) == -1)
errExit("timer_create");
printf("timer ID is 0x%lxn", (long) timerid);
}
当我调用这两个函数时,创建计时器成功,但设置&启动时出现分段错误。
whohas_timerid = NULL;
create_timer(SIG_WHOHAS, whohas_timerid);
set_start_timer(whohas_timerid, 3);
whohas_timerid是一个全局变量。
timer_t whohas_timerid;
输出如下:
create timer
timer ID is 0x877e918
set timer
Segmentation fault (core dumped)
该代码运行在Ubuntu 16.04 i386上。
有人能帮我找出问题吗?或者这不是这些计时器代码的问题吗?谢谢
Philipp Gesang:您将
whoas_timerid
作为指针传递。对它的写入在函数之外没有任何作用,您只对寄存器进行写入,因此timer_settime
将被传递给NULL
。
如果要将其用作out变量,则它必须是create_timer
中的指针timer_t *
才能覆盖全局。或者直接从那里设置whoas_timerid
,而不将其作为参数传递。或者更好的是,从函数中返回它。
Philipp解决了我的问题!我从create_timer
返回了timer_t
,并将其写入whohas_timerid
,timer_settime
现在似乎工作得很好。