son - ¿Hay una función de sueño alternativa en C a milisegundos?
segundos a milisegundos (5)
Tengo un código fuente que fue compilado en Windows. Lo estoy convirtiendo para ejecutar en Red Hat Linux.
El código fuente ha incluido el archivo de encabezado <windows.h>
y el programador ha utilizado la función Sleep()
para esperar durante un período de milisegundos. Esto no funcionará en Linux.
Sin embargo, puedo usar la función de sleep(seconds)
, pero eso usa números enteros en segundos. No quiero convertir milisegundos en segundos. ¿Hay alguna función de suspensión alternativa que pueda usar con la compilación de gcc en Linux?
Alternativamente a usleep()
, que no está definido en POSIX 2008 (aunque fue definido hasta POSIX 2004, y está evidentemente disponible en Linux y otras plataformas con un historial de cumplimiento POSIX), el estándar POSIX 2008 define nanosleep()
:
nanosleep
- sueño de alta resolución
#include <time.h> int nanosleep(const struct timespec *rqtp, struct timespec *rmtp);
La función
nanosleep()
hará que el hilo actual se suspenda de la ejecución hasta que haya transcurrido el intervalo de tiempo especificado por el argumentorqtp
o se haya entregado una señal al hilo de llamada, y su acción sea invocar una función de captura de señal o finalizar el proceso. El tiempo de suspensión puede ser más largo que el solicitado porque el valor del argumento se redondea a un múltiplo entero de la resolución de suspensión o debido a la programación de otra actividad por parte del sistema. Pero, excepto en el caso de ser interrumpido por una señal, el tiempo de suspensión no deberá ser menor que el tiempo especificado porrqtp
, medido por el reloj del sistema CLOCK_REALTIME.El uso de la función
nanosleep()
no tiene ningún efecto sobre la acción o el bloqueo de ninguna señal.
Más allá del usleep , la select humilde con conjuntos de descriptores de archivos NULL le permitirá pausar con precisión de microsegundos y sin el riesgo de complicaciones SIGALRM
.
sigtimedwait y sigwaitinfo ofrecen un comportamiento similar.
Puedes usar esta función multiplataforma:
#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
}
Sí, POSIX estándares POSIX más antiguos definían usleep()
, por lo que está disponible en Linux:
int usleep(useconds_t usec);
DESCRIPCIÓN
La función usleep () suspende la ejecución del proceso de llamada durante (al menos) microsegundos de uso. La suspensión puede alargarse levemente por cualquier actividad del sistema o por el tiempo empleado en procesar la llamada o por la granularidad de los temporizadores del sistema.
usleep()
tarda microsegundos , por lo que tendrá que multiplicar la entrada por 1000 para poder dormir en milisegundos.
usleep()
ha sido desaprobado y eliminado posteriormente de POSIX; para el nuevo código, se prefiere nanosleep()
:
#include <time.h> int nanosleep(const struct timespec *req, struct timespec *rem);
DESCRIPCIÓN
nanosleep()
suspende la ejecución del subproceso de llamada hasta que ha transcurrido al menos el tiempo especificado en*req
o la entrega de una señal que desencadena la invocación de un controlador en el subproceso de llamada o que finaliza el proceso.La estructura timespec se usa para especificar intervalos de tiempo con precisión de nanosegundos. Se define de la siguiente manera:
struct timespec { time_t tv_sec; /* seconds */ long tv_nsec; /* nanoseconds */ };
#include <unistd.h>
int usleep(useconds_t useconds); //pass in microseconds