【问题标题】:Difference between `sleep` and `pause` library functions in unistd.hunistd.h 中 `sleep` 和 `pause` 库函数之间的区别
【发布时间】:2019-10-31 17:58:58
【问题描述】:

来自pause的手册页

pause() 导致调用进程(或线程)进入休眠状态,直到发出终止进程或调用信号捕获函数的信号。

来自sleep的手册页

sleep() 使调用线程休眠,直到秒秒过去或没有被忽略的信号到达。

/* This will wait till the signal arrives and it should be handled */
pause();

/* is it same as the above one */
/* This will also sleep for infinite time untill the signal arrives and it should be handled */
while (1) {
    int ret = sleep(3);
    if (ret != 0)
        break;
}

sleeppause的源代码,实现方式不同。

它们的实现有什么区别? 从应用程序的角度来看,何时使用pause,何时使用sleep

【问题讨论】:

  • 如果您在手机上运行第二个代码 - 不要忘记每天晚上充电... ;-)
  • 第二个不一样,因为如果 pause() 通过信号终止,您的程序将继续。然而,你的睡眠循环将再次进入你的循环体并一次又一次地进入睡眠状态......但是你可以从循环中检查是否发生了信号并决定退出循环。
  • 感谢@hetepeperfan,我更改了第二种情况的代码。
  • sleep 返回“如果请求的时间已过,则返回零,如果调用被信号处理程序中断,则返回休眠的秒数。”
  • 对,这就是我在回答中已经解释过的。抱歉匆忙发表评论;-)

标签: c signals sleep


【解决方案1】:

两者都可以通过以下方式在 POSIX 系统上轻松实现:

#include <poll.h>
int pause(){ return poll(0, 0, -1); }
int sleep(unsigned int s){ return poll(0, 0, s * 1000); }

事实上,第二个是作弊,因为sleep应该返回如果被打断还剩下的睡眠时间,但谁真正在乎那个\;-.

但这正是sleep(3) 在glibc 源代码中以更迂回的方式实现的原因。否则,任何阻塞的non-restartable 系统调用都会执行,包括但不限于nanosleep(2)poll(2)select(2)sigsuspend(2)。使用什么更多的是兼容性问题。

【讨论】:

  • 我将更改描述,因为pausesleep 是库函数。
  • 应该知道sleep是成功还是中断。
  • 所有sleeppausepoll等都将返回-1并将errno设置为EINTR。这就是您应该检查的内容。
  • 明白了,poll 被中断时确实会设置 errno EINTR。
【解决方案2】:

sleep() 使调用线程休眠,直到秒秒过去 一个未被忽略的信号到达。

所以pause 完全阻塞线程的执行,直到收到信号,但是sleep 有第二种可能解除阻塞线程,即指定等待的秒数。因此,使用pause,您必须等待信号到达,但使用睡眠时,您可能只等待特定时间,就像在网络中一样,您不会无限等待包裹到达(超时)。

【讨论】:

  • 我同意这一点,但我想知道更多的是什么时候应该使用pause,什么时候应该使用sleep。两者看起来都与我相似,但都以不同的方式实现。
  • @Shubham 不同实现的原因是,pause 可以通过定义信号等待的信号掩码来实现相当简单,然后简单地暂停执行直到收到信号@987654327 @ 和sleep 您需要定期检查是否超过时间或是否捕获到导致继续的信号。当您确定有一个新格拉到达并且您需要不惜一切代价等待它时,请使用sleep。当您无法无限等待信号时使用sleep,因为不确定它是否到达。
  • @Shubham 真的没什么区别。请注意,不是每 3 秒唤醒您的进程,您可以调用 sleep() 并有很长的延迟,例如。通过滥用有符号->无符号转换:sleep(-1)。所有(不可重新启动的)阻塞系统调用基本上都是相同的,唯一不同的是它们提供的其他功能以及“等待信号”。
猜你喜欢
  • 2011-07-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-23
  • 1970-01-01
  • 2013-02-09
  • 2014-06-08
相关资源
最近更新 更多