gpt4 book ai didi

c - 如果已经设置了警报, alarm() 的返回值是多少

转载 作者:太空宇宙 更新时间:2023-11-04 06:58:27 27 4
gpt4 key购买 nike

在APUE书的第10章Signals中,有一个示例代码:

#include <signal.h>
#include <unistd.h>

static void sig_alrm(int signo) {
/* nothing to do, just return to wake up the pause */
}

unsigned int sleep1(unsigned int seconds) {
if (signal(SIGALRM, sig_alrm) == SIG_ERR)
return(seconds);

alarm(seconds); /* start the timer */
pause(); /* next caught signal wakes us up */
return(alarm(0)); /* turn off timer, return unslept time */
}

int main() {
sleep1(1);
return 0;
}

它只是实现了一个“不完整的”sleep()。

书上说“这个函数看起来像 sleep 函数,但是这个简单的实现存在三个问题。”

  1. 如果来电者已经设置了闹钟,则该闹钟会在第一次调用闹钟时删除。我们可以通过查看警报的返回值来纠正这个问题。如果某个先前设置的警报之前的秒数小于参数,那么我们应该只等到现有警报到期。如果之前设置的闹钟会在我们之后响起,那么在返回之前,我们应该将这个闹钟重置为在未来的指定时间响起。

  2. 我们已经修改了 SIGALRM 的配置。如果我们正在编写一个供其他人调用的函数,我们应该在我们的函数被调用时保存处置,并在我们完成后恢复它。我们可以通过保存信号的返回值并在函数返回之前重置配置来纠正此问题。

  3. 在第一次调用 alarm 和调用 pause 之间存在竞争条件。在一个繁忙的系统上,有可能在我们调用暂停之前警报响起并调用信号处理程序。如果发生这种情况,调用者将在暂停调用中永远挂起(假设未捕获到其他信号)。

我对以上3种说法有些怀疑:

  1. 有人可以为语句 1 提供一些示例代码吗?

  2. 我不知道 statement2 说的是什么,有人能给我一个有力的解释吗?

  3. 我不知道为什么语句 3 会导致竞争条件。

非常感谢!

最佳答案

在标题中回答你的问题。

返回值是之前调用 alarm()

时剩余的秒数

关于c - 如果已经设置了警报, alarm() 的返回值是多少,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41334472/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com