来自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;
}
它们的实现之间有什么区别?
从应用程序的角度来看,何时使用pause
和何时使用sleep
。
答案 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>