c-Linux timer_settime()生成分段错误



我正在为一个项目使用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_timeridtimer_settime现在似乎工作得很好。

最新更新