Вопрос по linux, sleep, c – Есть ли альтернативная функция сна в C до миллисекунд?

106

У меня есть некоторый исходный код, который был скомпилирован в Windows. Я конвертирую его для запуска на Red Hat Linux.

Исходный код включает в себя<windows.h> заголовочный файл и программист использовалSleep() функция ожидания в течение миллисекунд. Это не сработает на Linux.

Тем не менее, я могу использоватьsleep(seconds) функция, но это использует целое число в секундах. Я не хочу преобразовывать миллисекунды в секунды. Есть ли альтернативная функция сна, которую я могу использовать при компиляции gcc в Linux?

Для использования в этом случае мы должны сбросить выводfflush(stdout); после каждогоprintf() EsmaeelE
sleep(/*seconds*/) в<unistd.h> работает, но если я использую сprintf("some things") без\n, это не работает. EsmaeelE

Ваш Ответ

6   ответов
13
#include <unistd.h>

int usleep(useconds_t useconds); //pass in microseconds
22

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

sigtimedwait и sigwaitinfo предложить подобное поведение.

«без риска sigalarm»; : какой риск и в каком случае? зовет спать и уснуть?
@Massimo, связанная спецификация дляusleep имеет несколько предложений о неопределенном поведении SIGALARM. (В принципе,usleep а такжеsleep разрешено осуществлять через старыйalarm механизм, который вы можете себе представить, усложнит безопасное использованиеusleep и СИГАЛАРМ. Я не знаю ни одной современной системы, которая делает это таким образом, но она все еще в спецификации.)
Потенциально полезный умный трюк ...
31

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

nanosleep - high resolution sleep

#include <time.h>
int nanosleep(const struct timespec *rqtp, struct timespec *rmtp);

The nanosleep() function shall cause the current thread to be suspended from execution until either the time interval specified by the rqtp argument has elapsed or a signal is delivered to the calling thread, and its action is to invoke a signal-catching function or to terminate the process. The suspension time may be longer than requested because the argument value is rounded up to an integer multiple of the sleep resolution or because of the scheduling of other activity by the system. But, except for the case of being interrupted by a signal, the suspension time shall not be less than the time specified by rqtp, as measured by the system clock CLOCK_REALTIME.

The use of the nanosleep() function has no effect on the action or blockage of any signal.

152

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

   int usleep(useconds_t usec);

DESCRIPTION

The usleep() function suspends execution of the calling thread for (at least) usec microseconds. The sleep may be lengthened slightly by any system activity or by the time spent processing the call or by the granularity of system timers.

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


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

   #include <time.h>

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

DESCRIPTION

nanosleep() suspends the execution of the calling thread until either at least the time specified in *req has elapsed, or the delivery of a signal that triggers the invocation of a handler in the calling thread or that terminates the process.

The structure timespec is used to specify intervals of time with nanosecond precision. It is defined as follows:

       struct timespec {
           time_t tv_sec;        /* seconds */
           long   tv_nsec;       /* nanoseconds */
       };
36

Вы можете использовать эту кроссплатформенную функцию:

#ifdef WIN32
#include <windows.h>
#elif _POSIX_C_SOURCE >= 199309L
#include <time.h>   // for nanosleep
#else
#include <unistd.h> // for usleep
#endif

void sleep_ms(int milliseconds) // cross-platform sleep function
{
#ifdef WIN32
    Sleep(milliseconds);
#elif _POSIX_C_SOURCE >= 199309L
    struct timespec ts;
    ts.tv_sec = milliseconds / 1000;
    ts.tv_nsec = (milliseconds % 1000) * 1000000;
    nanosleep(&ts, NULL);
#else
    usleep(milliseconds * 1000);
#endif
}
Когда у нас нет_POSIX_C_SOURCE >= 199309Lкак в случае-ansi или же-std=c89Я бы порекомендовал использоватьstruct timeval tv; tv.tv_sec = milliseconds / 1000; tv.tv_usec = milliseconds % 1000 * 1000; select(0, NULL, NULL, NULL, &tv); вместоusleep(milliseconds * 1000);, Кредит идетhere.
-2
#include <stdio.h>
#include <stdlib.h>
int main () {

puts("Program Will Sleep For 2 Seconds");

system("sleep 2");      // works for linux systems


return 0;
}
Это не спит в течение миллисекунд, а также вносит гораздо больше накладных расходов, что делает синхронизацию еще более ненадежной.

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