区分由计时器生成的sigalrm和用户生成的sigalrm

时间:2014-04-18 17:03:41

标签: c linux kill alarm

我正在尝试找到一种方法使程序正常工作,这意味着程序必须每10秒钟获得一次sigalrm,直到100秒。

如果我输入命令kill -alrm program_process_pid,则必须完全忽略此sigalrm,因此程序不会受其影响。它必须像预期的那样工作。

我已经读过alarm()函数返回上次编程的警报完成之前的秒数。我还没有办法做到这一点,它部分有效。

有人有想法吗?任何事都将不胜感激

3 个答案:

答案 0 :(得分:1)

只需跟踪您想要唤醒的时间,并在早期启动时设置新的计时器。

在伪代码中,警报处理程序会执行:

if wakeupTime is not null:
  if currentTime < wakeupTime:
    alarm (wakeupTime - currentTime)
  else:
    start_processing
    wakeupTime = null

这样,进程是否接收到伪SIGALRM并不重要,它也可以更好地处理时钟偏移。

答案 1 :(得分:1)

如果先前安排的警报尚未触发,alarm()函数将返回非零值,因此在信号处理程序中,您可以调用alarm(0)以(1)取消之前的警报,以及(2)确定是否需要取消。如果它返回非零值,则表示警报是从外部生成的,您可以使用返回的值再次调用alarm以重新安排自己的值。

我不确定alarm是否会在警报触发后返回零但是信号在外部生成的警报后排队(但是,如果生成了外部警报信号只有才能解雇你之前)。 POSIX标准对此有点模糊。

答案 2 :(得分:1)

避免这种情况的最简单方法是使用仅生成alarm的{​​{1}}。

POSIX定时器允许您指定要发送的信号,甚至可以区分该信号类型中的不同信号。请参阅timer_createtimer_settimetimer_delete

请注意,这些问题涉及学习曲线,因此您需要首先阅读并进行研究,但如果您想避免群集黑客工作,这就是您想要的。