区分定时器生成的信号和用户生成的信号

我试图find一种方法来使程序正常工作,这意味着程序必须每10秒钟获得一个信号,直到100秒。

如果我input命令kill -alrm program_process_pid,那么这个sigalrm必须被完全忽略,所以程序不会受到它的影响。 它必须像预期的那样工作。

我已经读过了,alarm()函数返回到上一次编程的警报结束的秒数。 我还没有find办法做到这一点,它部分工作。

有人有想法吗? 任何东西将不胜感激

只要跟踪你想要醒来的时间,并设置一个新的计时器,如果它提前关闭。

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

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

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

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

我不知道如果alarm已经触发,但是信号排队在外部产生的警报之后,警报是否会返回到零,但是(也就是说,如果外部警报信号是在你被触发之前产生的话)。 POSIX标准有点模糊。

避免这种情况最简单的方法不是使用只产生SIGALRM alarm

有POSIX定时器,允许您指定要发送的信号,甚至在该信号类型内区分不同的信号。 请参阅timer_create , timer_settime , timer_delete等

请注意,这些内容涉及到一些学习曲线,所以您需要先阅读并进行研究,但是如果您想避免集群黑客攻击,那么这就是您想要的。