一尘不染

在C到毫秒之间是否有替代的睡眠功能?

linux

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

源代码包括<windows.h>头文件,并且程序员已使用该Sleep()函数等待毫秒的时间。这在Linux上不起作用。

但是,我可以使用该sleep(seconds)函数,但是它使用整数(以秒为单位)。我不想将毫秒转换为秒。我可以在Linux上的gcc编译中使用其他睡眠功能吗?


阅读 224

收藏
2020-06-02

共1个答案

一尘不染

是-
定义了较早的POSIX标准usleep(),因此在Linux上可用:

   int usleep(useconds_t usec);

描述

usleep()函数将调用线程的执行挂起(至少)usec微秒。任何系统活动,处理呼叫所花费的时间或系统计时器的粒度都可能会稍微延长睡眠时间。

usleep()需要 微秒 ,因此您必须将输入乘以1000才能hibernate。


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>

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;
}
2020-06-02