Существует ли альтернативная функция сна в C к миллисекундам?

Вот что я использую

ls -d1 /Directory/Path/*;

120
задан Jonathan Leffler 11 June 2017 в 01:07
поделиться

4 ответа

Да - более старые стандарты POSIX определены usleep () , поэтому это доступно в Linux:

  int usleep (useconds_t usec);

ОПИСАНИЕ

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

usleep () занимает микросекунды , поэтому вам придется умножить ввод на 1000, чтобы засыпать в миллисекундах.


usleep () имеет поскольку устарела и впоследствии была удалена из POSIX; для нового кода предпочтительнее nanosleep () :

  #include 

 int nanosleep (const struct timespec * req, struct timespec * rem);

ОПИСАНИЕ

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

Структура timespec используется для указания интервалов времени с точностью до наносекунды. Он определяется следующим образом:

  struct timespec {
time_t tv_sec; / * секунды * /
long tv_nsec; / * наносекунды * /
 };

Пример функции msleep () , реализованной с использованием nanosleep () , продолжающей спящий режим, если он прерван сигналом:

int msleep(long msec)
{
    struct timespec ts;
    int res;

    if (msec < 0)
    {
        errno = EINVAL;
        return -1;
    }

    ts.tv_sec = msec / 1000;
    ts.tv_nsec = (msec % 1000) * 1000000;

    do {
        res = nanosleep(&ts, &ts);
    } while (res && errno == EINTR);

    return res;
}
163
ответ дан 24 November 2019 в 01:37
поделиться
#include <unistd.h>

int usleep(useconds_t useconds); //pass in microseconds
13
ответ дан 24 November 2019 в 01:37
поделиться

В качестве альтернативы usleep () , который не определен в POSIX 2008 (хотя он был определен до POSIX 2004 и, очевидно, доступен в Linux и других платформах с история соответствия POSIX), стандарт POSIX 2008 определяет nanosleep () :

nanosleep - сон высокого разрешения

 #include 
int nanosleep (const struct timespec * rqtp, struct timespec * rmtp);

Функция nanosleep () должна вызывать приостановку выполнения текущего потока до тех пор, пока либо не истечет временной интервал, указанный в аргументе rqtp , либо сигнал не будет доставлен вызывающему thread, а его действие - вызвать функцию перехвата сигналов или завершить процесс. Время приостановки может быть больше запрошенного, поскольку значение аргумента округлено до целого числа, кратного разрешающей способности сна, или из-за планирования других действий системой. Но, за исключением случая прерывания сигналом, время приостановки не должно быть меньше времени, указанного в rqtp , измеренного системными часами CLOCK_REALTIME.

Использование ] nanosleep () не влияет на действие или блокировку любого сигнала.

31
ответ дан 24 November 2019 в 01:37
поделиться

Помимо usleep , скромный select с NULL наборами файловых дескрипторов позволит вам делать паузы с точностью до микросекунд и без риска SIGALRM осложнения.

sigtimedwait и sigwaitinfo предлагают аналогичное поведение.

24
ответ дан 24 November 2019 в 01:37
поделиться
Другие вопросы по тегам:

Похожие вопросы: