Tengo un código fuente que se compiló en Windows. Lo estoy convirtiendo para que se ejecute en Red Hat Linux.
El código fuente ha incluido el <windows.h>
archivo de encabezado y el programador ha utilizado la Sleep()
función para esperar un período de milisegundos. Esto no funcionará en Linux.
Sin embargo, puedo usar la sleep(seconds)
función, pero eso usa un número entero en segundos. No quiero convertir milisegundos a segundos. ¿Existe una función de suspensión alternativa que pueda usar con la compilación de gcc en Linux?
sleep(/*seconds*/)
en<unistd.h>
trabajos, pero si uso conprintf("some things")
sin\n
, no funciona.fflush(stdout);
después de cada unoprintf()
Respuestas:
Sí, se han definido estándares POSIX anteriores
usleep()
, por lo que está disponible en Linux:usleep()
toma microsegundos , por lo que deberá multiplicar la entrada por 1000 para dormir en milisegundos.usleep()
desde entonces ha quedado en desuso y posteriormente eliminado de POSIX; para el nuevo código,nanosleep()
se prefiere:Una
msleep()
función de ejemplo implementada usandonanosleep()
, continuando el sueño si es interrumpido por una señal:fuente
Puede usar esta función multiplataforma:
fuente
_POSIX_C_SOURCE >= 199309L
, como en el caso de-ansi
o-std=c89
, recomendaría usar enstruct timeval tv; tv.tv_sec = milliseconds / 1000; tv.tv_usec = milliseconds % 1000 * 1000; select(0, NULL, NULL, NULL, &tv);
lugar deusleep(milliseconds * 1000);
. El crédito va aquí .nanosleep()
documentación: man7.org/linux/man-pages/man2/nanosleep.2.html . Publicar los enlaces de documentación para cada función específica de plataforma utilizada aquí sería útil.gcc -Wall -g3 -std=c11 -o sleep_test sleep_test.c && ./sleep_test
el Linux Ubuntu, la versión de gcc 4.8.4, aparece el siguiente aviso:warning: implicit declaration of function ‘usleep’ [-Wimplicit-function-declaration]
. La solución es agregar las siguientes 2 definiciones en la parte superior de su código: 1)#define __USE_POSIX199309
y 2)#define _POSIX_C_SOURCE 199309L
. Ambos son necesarios para que el código se compile sin advertencias (y también para usar lananoseconds()
función, que tiene disponible).Alternativamente
usleep()
, que no está definido en POSIX 2008 (aunque se definió hasta POSIX 2004, y evidentemente está disponible en Linux y otras plataformas con un historial de cumplimiento POSIX), el estándar POSIX 2008 definenanosleep()
:fuente
Más allá de usleep , la selección humilde con conjuntos de descriptores de archivo NULL le permitirá pausar con precisión de microsegundos y sin riesgo de
SIGALRM
complicaciones.sigtimedwait y sigwaitinfo ofrecen un comportamiento similar.
fuente
fuente
fuente