是否有一个替代睡眠函数在C到毫秒?

我有一些在Windows上编译的源代码。 我将它转换为在Red Hat Linux上运行。

源代码包含了<windows.h>头文件,程序员使用了Sleep()函数等待几毫秒。 这在Linux上不起作用。

但是,我可以使用sleep(seconds)function,但在几秒钟内使用整数。 我不想将毫秒转换为秒。 有一个替代的睡眠函数,我可以使用gcc在Linux上编译?

是的 – 较老的POSIX标准定义了usleep() ,所以这在Linux上是可用的:

  int usleep(useconds_t usec); 

描述

usleep()函数暂停(至less)usec微秒的调用进程的执行。 任何系统活动或处理呼叫的时间或系统定时器的粒度,睡眠可能会稍微延长。

usleep()需要几微秒 ,所以你将不得不乘以1000以毫秒睡眠。


usleep()已被弃用,随后从POSIX中删除; 对于新代码, nanosleep()是首选:

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

描述

nanosleep()暂停调用线程的执行,直到至less在*req指定的时间已经过去,或者在调用线程中触发一个处理程序的调用或终止进程的信号的传递。

结构timespec用于指定纳秒级精度的时间间隔。 它被定义如下:

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

你可以使用这个跨平台function:

 #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 2008中未定义的usleep() ,POSIX 2008标准还定义了nanosleep() :(虽然它是在POSIX 2004中定义的,并且在Linux和其他平台上显然可用nanosleep()

nanosleep – 高分辨率睡眠

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

nanosleep()函数应该使当前线程暂停执行,直到rqtp参数指定的时间间隔已经过去,或者信号传递给调用线程,其动作是调用一个信号捕获函数或终止进程。 暂停时间可能比请求的时间长,因为参数值四舍五入到睡眠分辨率的整数倍或由于系统调度其他活动。 但是,除了被信号中断的情况外,挂起时间应不小于由系统时钟CLOCK_REALTIME测量的rqtp指定的时间。

nanosleep()函数的使用对任何信号的动作或阻塞都没有影响。

除了使用usleep之外,使用NULL文件描述符集的简单select将使您能够以微秒的精度暂停,而不会出现SIGALRM复杂的风险。

sigtimedwait和sigwaitinfo提供了类似的行为。

 #include <unistd.h> int usleep(useconds_t useconds); //pass in microseconds