我有一些在Windows上编译的源代码。我正在将其转换为在Red Hat Linux上运行。
源代码包含<windows.h>
头文件,程序员使用Sleep()
函数等待一段时间。这不适用于Linux。
但是,我可以使用sleep(seconds)
函数,但在几秒钟内使用整数。我不想将毫秒转换为秒。是否有替代睡眠功能,我可以在Linux上使用gcc编译?
答案 0 :(得分:155)
是 - 较早的POSIX标准已定义usleep()
,因此可在Linux上使用:
int usleep(useconds_t usec);
说明
usleep()函数暂停执行调用线程 (至少)usec微秒。睡眠可能会稍微延长 任何系统活动或通过处理呼叫所花费的时间或通过 系统定时器的粒度。
usleep()
需要微秒,因此您必须将输入乘以1000才能以毫秒为单位进行休眠。
usleep()
已被弃用,随后从POSIX中移除;对于新代码,首选nanosleep()
:
#include <time.h> int nanosleep(const struct timespec *req, struct timespec *rem);
说明
nanosleep()
暂停执行调用线程,直到至少*req
中指定的时间已经过去,或者 传递一个触发调用处理程序的信号 调用线程或终止进程。结构timespec用于指定具有纳秒精度的时间间隔。它的定义如下:
struct timespec { time_t tv_sec; /* seconds */ long tv_nsec; /* nanoseconds */ };
答案 1 :(得分:39)
您可以使用此跨平台功能:
#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
}
答案 2 :(得分:31)
除了usleep()
之外,它没有在POSIX 2008中定义(尽管它定义为POSIX 2004,并且在Linux和其他具有POSIX兼容性历史的平台上显然可用),POSIX 2008标准定义nanosleep()
:
nanosleep
- 高分辨率睡眠#include <time.h> int nanosleep(const struct timespec *rqtp, struct timespec *rmtp);
nanosleep()
函数将导致当前线程暂停执行,直到rqtp
参数指定的时间间隔已经过去或者信号被传递给调用线程,并且其操作是调用信号捕获功能或终止进程。暂停时间可能比请求的时间长,因为参数值被舍入到睡眠分辨率的整数倍或者由于系统调度其他活动。但是,除了被信号中断的情况外,暂停时间不应小于rqtp
指定的时间,由系统时钟CLOCK_REALTIME测量。使用
nanosleep()
功能对任何信号的动作或阻塞都没有影响。
答案 3 :(得分:23)
超越usleep,具有NULL文件描述符集的简陋select将允许您以微秒精度暂停,并且没有SIGALRM
并发症的风险。
sigtimedwait and sigwaitinfo提供类似的行为。
答案 4 :(得分:13)
#include <unistd.h>
int usleep(useconds_t useconds); //pass in microseconds
答案 5 :(得分:-4)
#include <stdio.h>
#include <stdlib.h>
int main () {
puts("Program Will Sleep For 2 Seconds");
system("sleep 2"); // works for linux systems
return 0;
}