小编典典

C 到毫秒是否有替代睡眠功能?

all

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

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

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


阅读 138

收藏
2022-08-02

共1个答案

小编典典

是的 -
定义了较旧的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;
}
2022-08-02