我正在尝试找到一种方法使程序正常工作,这意味着程序必须每10秒钟获得一次sigalrm,直到100秒。
如果我输入命令kill -alrm program_process_pid,则必须完全忽略此sigalrm,因此程序不会受其影响。它必须像预期的那样工作。
我已经读过alarm()函数返回上次编程的警报完成之前的秒数。我还没有办法做到这一点,它部分有效。
有人有想法吗?任何事都将不胜感激
答案 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_create,timer_settime,timer_delete等
请注意,这些问题涉及学习曲线,因此您需要首先阅读并进行研究,但如果您想避免群集黑客工作,这就是您想要的。