Difference between `sleep` and `pause` library functions in unistd.h

Viewed 1737

From man page of pause

pause() causes the calling process (or thread) to sleep until a signal is delivered that either terminates the process or causes the invocation of a signal-catching function.

From man page of sleep

sleep() makes the calling thread sleep until seconds seconds have elapsed or a signal arrives which is not ignored.

/* 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;
}

Source code of sleep and pause, both has been implemented in different way.

What is the difference between their implementation? From application point of view when to use pause and when to use sleep.

2 Answers

Both could be trivially implemented on a POSIX system by:

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

In fact, the 2nd is cheating, as sleep should return the time still left to sleep if interrupted, but who really cares about that \;-.

But it's exactly that complication the reason why sleep(3) is implemented in a more round-about way in the glibc source. Otherwise, any blocking non-restartable system call will do, including but not limited to nanosleep(2), poll(2), select(2) or sigsuspend(2). What to use is more a matter of compatibility.

sleep() makes the calling thread sleep until seconds seconds have elapsed or a signal arrives which is not ignored.

So pause completely blocks execution of the thread until a signal is received but with sleep there is a second possibility to unblock the thread namely the seconds specified to wait for. So with pause you have to wait for a signal to arrive but with sleep, you have the possibility to only wait a certain time, like in a network you will not wait infinitely for a package to arrive (timeout).

Related