如何在C中暂停非整数时间?

如何在C中暂停非整数时间?,c,linux,C,Linux,我正在编写一个简单的程序,当我将一个非整数值传递给sleep()函数时,它会给我一个错误。是否有另一个函数或使用sleep()的另一种方法允许我将程序暂时暂停不到一秒钟(或者说2.5秒) mario.c:34:13:错误:函数“usleep”的隐式声明在C99[-Werror,-Wimplicit函数声明]中无效 美国LEEP(30000) ^ 将暂停特定的微秒数。例如: usleep(500000); #define _POSIX_C_SOURCE 200112L #include <

我正在编写一个简单的程序,当我将一个非整数值传递给sleep()函数时,它会给我一个错误。是否有另一个函数或使用sleep()的另一种方法允许我将程序暂时暂停不到一秒钟(或者说2.5秒)

mario.c:34:13:错误:函数“usleep”的隐式声明在C99[-Werror,-Wimplicit函数声明]中无效
美国LEEP(30000)
^

将暂停特定的微秒数。例如:

usleep(500000);
#define _POSIX_C_SOURCE 200112L
#include <time.h>
#include <errno.h>

/* Sleep; returns un-slept (leftover) time.
*/
double dsleep(const double seconds)
{
    const long  sec = (long)seconds;
    const long  nsec = (long)((seconds - (double)sec) * 1e9);
    struct timespec  req, rem;

    if (sec < 0L)
        return 0.0;
    if (sec == 0L && nsec <= 0L)
        return 0.0;

    req.tv_sec = sec;
    if (nsec <= 0L)
        req.tv_nsec = 0L;
    else
    if (nsec <= 999999999L)
        req.tv_nsec = nsec;
    else
        req.tv_nsec = 999999999L;

    rem.tv_sec = 0;
    rem.tv_nsec = 0;

    if (nanosleep(&req, &rem) == -1) {
        if (errno == EINTR)
            return (double)rem.tv_sec + (double)rem.tv_nsec / 1000000000.0;
        else
            return seconds;
    } else
        return 0.0;
}
将暂停半秒钟

在某些系统上,根据编译器配置等,您可能需要在包含
unistd.h
(理想情况下,在源文件的开头)之前定义
\u GNU\u SOURCE


sleep()的int值表示以毫秒为单位的暂停时间,而不是秒。因此,要暂停一秒钟,您将通过1000。2.5秒,你就能通过2500次。在半秒钟内,您将通过500。

这将允许您以秒为单位将延迟指定为浮点。
该函数将一直执行,直到启动和停止之间的差值大于请求的延迟

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

void floatdelay ( float delay);

int main()
{
    float pause = 1.2;
    floatdelay ( pause);
    return 0;
}

void floatdelay ( float delay)
{
    clock_t start;
    clock_t stop;

    start = clock();
    stop = clock();
    while ( ( (float)( stop - start)/ CLOCKS_PER_SEC) < delay) {
        stop = clock();
    }
}
#包括
#包括
#包括
无效浮动延迟(浮动延迟);
int main()
{
浮动暂停=1.2;
延迟(暂停);
返回0;
}
无效浮动延迟(浮动延迟)
{
时钟没有启动;
时钟不停;
开始=时钟();
停止=时钟();
while(((浮动)(停止-启动)/时钟每秒)<延迟){
停止=时钟();
}
}

最初建议使用
usleep
的明显问题在于忽略了
\u GNU\u SOURCE
,这是一个为Linux提供的几乎所有POSIX扩展

使用带有严格警告标志的
c99
进行编译时不会对我发出警告:

#include <unistd.h>
#include <time.h>

int main(void)
{             
    usleep(1);
    nanosleep(0,0);
    return 0;
}
如前所述,
usleep
nanosleep
函数是扩展。更常见的是,或被使用。这些函数用于等待一个或多个打开文件上的活动的指定时间间隔。作为一种特殊情况,
select
甚至不必等待文件,只需使用时间间隔即可。与
nanosleep
类似,
select
使用时间间隔结构来允许双精度值,但其值范围以微秒开始,而
nanosleep
以纳秒开始

这些函数都是LinuxC库的一部分


ncurses(与任何X/opencurses一样)提供了一个等待毫秒的函数。在内部,ncurses根据其可用性使用(因为)nanosleep或usleep(它们毕竟是扩展),或者使用
select
poll
,也取决于可用性的内部函数。

POSIX.1-2001标准定义了函数,该函数非常适合于此。与
sleep()
usleep()
不同,
nanosleep()
不会干扰信号

然而,当前的Linux C库倾向于实现
usleep()
,作为
nanosleep()
的包装器。如果您
strace
一个测试程序(比如运行
strace/bin/sleep 1
),就可以看到这一点

但是,由于
nanosleep()
是POSIX.1-2001标准的一部分,因此绝对推荐使用它

例如:

usleep(500000);
#define _POSIX_C_SOURCE 200112L
#include <time.h>
#include <errno.h>

/* Sleep; returns un-slept (leftover) time.
*/
double dsleep(const double seconds)
{
    const long  sec = (long)seconds;
    const long  nsec = (long)((seconds - (double)sec) * 1e9);
    struct timespec  req, rem;

    if (sec < 0L)
        return 0.0;
    if (sec == 0L && nsec <= 0L)
        return 0.0;

    req.tv_sec = sec;
    if (nsec <= 0L)
        req.tv_nsec = 0L;
    else
    if (nsec <= 999999999L)
        req.tv_nsec = nsec;
    else
        req.tv_nsec = 999999999L;

    rem.tv_sec = 0;
    rem.tv_nsec = 0;

    if (nanosleep(&req, &rem) == -1) {
        if (errno == EINTR)
            return (double)rem.tv_sec + (double)rem.tv_nsec / 1000000000.0;
        else
            return seconds;
    } else
        return 0.0;
}
#定义POSIX_C_SOURCE200112L
#包括
#包括
/*睡眠;返回未睡眠(剩余)时间。
*/
双dsleep(常数双秒)
{
常量长秒=(长)秒;
常量长nsec=(长)((秒-(双)秒)*1e9);
结构时间规格要求,rem;
如果(秒<0升)
返回0.0;

如果(sec==0L&&nsec使用此宏暂停非整数秒:

#include "unistd.h"
#define mysleep(s) usleep(s*1000000)

你是Linux吗?Windows?其他什么?你试过了吗?我想他们中的大多数都会让你使用ms(毫秒)。使用usleep如中所述我在Linux上,我试过usleep,但它给了我一个错误。我包括unistd.h。也许你想的是
usleep()
——如果在UNIX上的话——这需要微秒(不是毫秒)
sleep()
不是C标准函数。
sleep()
的时间单位各不相同。说明编译器/OS有帮助。尽管您在Windows上,没有
usleep()。
但是您可以使用
sleep(n)
以毫秒作为参数n。当我使用usleep时,它会给我一个错误,我用给定的错误更新了问题。
usleep
nanosleep
都是“较新”的功能,需要打开原始/老式接口的扩展。@NoahTronic您的Linux发行版、gcc版本和glibc版本是什么?(对于最后一个,运行
/lib/libc.so.6
。对于第二个,运行
gcc--version
)实际上,
\u GNU\u SOURCE
应该在构建系统中定义,而不是在源文件中定义,这是因为预定义符号的处理方式。正如我在下面提到的,这些函数已经使用了很长一段时间。这并不理想,但因为其他解决方案似乎不适合我(usleep和nanosleep都会导致错误),这是最好的解决方案。解决方案旋转,占用CPU时间。似乎是唯一一个与我的系统一起工作的解决方案,没有更改我的设置。对于我的目的来说,这已经足够好了。
#include "unistd.h"
#define mysleep(s) usleep(s*1000000)