unistd.h中“ sleep”和“ pause”库函数之间的区别

时间:2019-06-18 06:48:32

标签: c signals sleep

来自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

2 个答案:

答案 0 :(得分:3)

两者都可以通过以下方式在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)。使用什么更多的是兼容性问题。

答案 1 :(得分:3)

  

sleep()使调用线程进入睡眠状态,直到经过几秒钟为止 到达的信号被忽略。

因此,pause完全阻塞了线程的执行,直到接收到信号为止,但是使用sleep则有第二种方法来解除阻塞线程,即指定等待的秒数。因此,使用pause时,您必须等待信号到达而进入睡眠状态,则只能等待特定的时间,就像在网络中一样,您将不会无限期地等待包的到达(超时)。 / p>