关于SIGALRM和警报

时间:2013-03-17 12:52:34

标签: linux signals

有些东西让我感到困惑,核心代码是跟着

    char buffer[MAX_BUFFER+1];
    int ret;
    signal(SIGALRM,wakeup);
    printf("You have 3 seconds to enter the password\n");
    alarm(3);
    ret=read(0,buffer,MAX_BUFFER);
    alarm(0);

你能告诉我为什么这里需要秒警报(0),这是什么意思?谢谢!!!

1 个答案:

答案 0 :(得分:5)

它就在那里因为您可以在两秒钟内输入密码(例如),所以您不希望在此之后一秒钟发出警报。换句话说,如果您尝试超时的内容在发生超时之前实际完成,它会将关闭警报。

当没有当前警报激活时执行alarm(0)是无害的(除了干扰sleep之类的其他问题等等,但它们在这里并不重要)。

但是,如果您未预料到流氓SIGALRM,则可能会造成一些损害(例如,如果您已将SIGALRM处理程序重置为其他内容),那么无论如何,即使它已过期,它也更安全。