Answers:
是- 定义了较早的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 */ };
msleep()
使用实施的示例函数nanosleep()
,如果被信号中断则继续睡眠:
#include <time.h>
#include <errno.h>
/* msleep(): Sleep for the requested number of milliseconds. */
int msleep(long msec)
{
struct timespec ts;
int res;
if (msec < 0)
{
errno = EINVAL;
return -1;
}
ts.tv_sec = msec / 1000;
ts.tv_nsec = (msec % 1000) * 1000000;
do {
res = nanosleep(&ts, &ts);
} while (res && errno == EINTR);
return res;
}
您可以使用此跨平台功能:
#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
}
nanosleep()
文档:man7.org/linux/man-pages/man2/nanosleep.2.html。为此处使用的每个特定于平台的功能发布文档链接将很有用。
gcc -Wall -g3 -std=c11 -o sleep_test sleep_test.c && ./sleep_test
在Linux Ubuntu(gcc版本4.8.4)上进行编译时,会收到以下警告:warning: implicit declaration of function ‘usleep’ [-Wimplicit-function-declaration]
。解决方案是在代码的最顶部添加以下2个定义: 1)#define __USE_POSIX199309
和2)#define _POSIX_C_SOURCE 199309L
。两者都需要使代码在没有任何警告的情况下进行编译(并使用nanoseconds()
其具有的功能)。
或者到usleep()
,在2008年POSIX没有定义(虽然它确定了到2004年POSIX,这显然是可用于Linux和其他平台符合POSIX标准的历史),在2008年POSIX标准定义nanosleep()
:
nanosleep
-高分辨率睡眠#include <time.h> int nanosleep(const struct timespec *rqtp, struct timespec *rmtp);
该
nanosleep()
函数将导致当前线程被暂停执行,直到rqtp
经过参数指定的时间间隔或将信号传递到调用线程为止,并且该函数的作用是调用信号捕获函数或终止进程。暂停时间可能比请求的时间长,这是因为参数值被四舍五入为睡眠分辨率的整数倍,或者由于系统安排了其他活动。但是,除被信号中断的情况外,暂停时间不得少于rqtp
由系统时钟CLOCK_REALTIME所测量的所指定的时间。该
nanosleep()
功能的使用对任何信号的作用或阻塞没有影响。
sleep(/*seconds*/)
在<unistd.h>
工作,但如果我与printf("some things")
不一起使用\n
,它是行不通的。