Разница между библиотечными функциями `sleep` и` pause` в unistd.h - PullRequest
3 голосов
/ 18 июня 2019

Со страницы руководства, содержащей pause

pause () заставляет вызывающий процесс (или поток) в спящем режиме до тех пор, пока не будет доставлен сигнал, который либо завершает процесс, либо вызывает вызовФункция перехвата.

С man-страницы 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;
}

Исходный код sleep и pause, оба были реализованы по-разному.

Чточем отличается их реализация?С точки зрения приложения, когда использовать pause и когда использовать sleep.

Ответы [ 2 ]

3 голосов
/ 18 июня 2019

sleep () переводит вызывающий поток в спящий режим до истечения секунд или сигнала, который не игнорируется.

Таким образом, pause полностью блокирует выполнение потока до тех пор, пока не будет получен сигнал, но при sleep есть вторая возможность разблокировать поток, а именно секунды, указанные для ожидания. Таким образом, с pause вы должны ждать прихода сигнала, но во время сна у вас есть возможность ждать только определенное время, как в сети, вы не будете бесконечно ждать прибытия пакета (тайм-аут).

3 голосов
/ 18 июня 2019

Оба могут быть тривиально реализованы в системе POSIX следующим образом:

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

Фактически, 2-ой обманывает, так как sleep должен возвращать время, оставшееся до сна, если его прервать, но кого это волнуетоб этом \; -.

Но именно это усложнение является причиной, по которой sleep(3) реализован более подробно в источнике glibc.В противном случае подойдет любой блокирующий не перезапускаемый системный вызов , включая, но не ограничиваясь, nanosleep(2), poll(2), select(2) или sigsuspend(2).Что использовать - это вопрос совместимости.

...