2015-03-24 1597 views
-2

我正在写一个简单的程序,当我将一个非整数值传递给sleep()函数时,它给了我一个错误。是否有另一个函数或使用sleep()的不同方法,这将使我暂时暂停程序的时间少于一秒(或2.5)?如何在C中暂停非整数时间?

mario.c:34:13: error: implicit declaration of function 'usleep' is invalid in C99 [-Werror,-Wimplicit-function-declaration]
usleep(30000);
^

+0

你的Linux?视窗?还有别的吗? – 2015-03-24 21:53:22

+2

您是否尝试过http://linux.die.net/man/3/usleep? – 2015-03-24 21:53:40

+0

我认为他们中的大多数会让你使用毫秒(毫秒)。 – DigitalNinja 2015-03-24 21:54:30

回答

-3

这将让你指定延迟为几秒钟内浮动。
该函数执行直到开始和停止之间的差值大于请求的延迟时间。

#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(); 
    } 
} 
+0

不理想,但由于其他解决方案似乎不适用于我(睡眠和纳睡眠导致错误),这是最好的。 – Allydra 2015-03-24 22:27:38

+0

解决方案旋转,消耗CPU时间。 – 2015-03-25 01:17:03

+0

似乎是唯一一个适用于我的系统,不会更改我的设置。足够我的目的。 – Allydra 2015-04-01 22:57:31

3

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

usleep(500000); 

会暂停半秒钟。

在某些系统上,并且根据编译器配置等,你可能需要包括unistd.h之前定义_GNU_SOURCE(理想情况下,在源文件的开头),有:

#define _GNU_SOURCE 
+0

虽然如果你在Windows上,没有'usleep()''在那里,你会使用'睡眠(n )'以毫秒为参数n。 – JohnH 2015-03-24 21:58:43

+0

当我使用usleep时,它给了我一个错误,我更新了给定错误的问题。 – Allydra 2015-03-24 22:10:46

+0

nanosleep给我同样的错误。 – Allydra 2015-03-24 22:17:26

-1

睡眠()的int值是以毫秒为单位的暂停时间,而不是秒。所以,暂停一秒钟,你会通过它1000秒。2.5秒,你会通过它2500.半秒钟,你会通过500.

+2

根据http://linux.die.net/man/3/sleep这个参数是秒。 – jpw 2015-03-24 21:55:26

+0

也许你正在考虑'usleep()' - 如果在UNIX上 - 这需要几微秒(而不是毫秒) – JohnH 2015-03-24 21:58:16

+0

'sleep()'不是C标准函数。 sleep()的时间单位有所不同。说明你的编译器/操作系统有帮助。 – chux 2015-03-24 22:24:56

0

的明显问题与原来的建议,使用usleep是俯瞰_GNU_SOURCE,用于Linux的给出几乎所有的POSIX扩展。

这编译没有与严格的警告标志警告对我来说,使用c99

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

int main(void) 
{    
    usleep(1); 
    nanosleep(0,0); 
    return 0; 
} 

和(从其他脚本中提取)

ACTUAL_GCC=c99 gcc-stricter -D_GNU_SOURCE -c foo.c 

#!/bin/sh 
OPTS="-O -Wall -Wmissing-prototypes -Wstrict-prototypes -Wshadow -Wconversion 
-W 
    -Wbad-function-cast 
    -Wcast-align 
    -Wcast-qual 
    -Wmissing-declarations 
    -Wnested-externs 
    -Wpointer-arith 
    -Wwrite-strings 
    -ansi 
    -pedantic 
" 
${ACTUAL_GCC:-gcc} $OPTS "[email protected]" 

usleepnanosleep功能扩展,如上所述。更常见的是,使用selectpoll。这些函数用于等待指定的时间间隔来执行一个或多个打开文件的活动。作为特殊情况,select甚至不需要等待文件,而只是使用时间间隔。与nanosleep类似,select使用时间间隔的结构来允许双精度值 - 但其值范围以微秒开始,而nanosleep以纳秒开始。

这些函数都是Linux C库的一部分。

ncurses(像任何X/Open curses)提供的函数napms等待几毫秒。在内部,ncurses使用(自1998nanosleepusleep(取决于它们的可用性),还是使用selectpoll(也取决于可用性)的内部函数。

1

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

但是,目前的Linux C库倾向于实现usleep()作为围绕nanosleep()的包装。你可以看到这个如果你strace测试程序(说,运行strace /bin/sleep 1)。

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

例如:

#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; 
} 

最上面的逻辑的是确保(无论浮点舍入模式等等的)该纳秒场总是内[0,999999999],包容,并使其可以安全地用负值调用它(在这种情况下,它将返回零)。

如果要指定整数毫秒的时间,你可以使用

#define _POSIX_C_SOURCE 200112L 
#include <time.h> 
#include <errno.h> 

/* Sleep; returns un-slept (leftover) time. 
*/ 
long msleep(const long ms) 
{ 
    struct timespec req, rem; 

    if (ms <= 0L) 
     return 0L; 

    req.tv_sec = ms/1000L; 
    req.tv_nsec = (ms % 1000L) * 1000000L; 
    rem.tv_sec = 0; 
    rem.tv_nsec = 0; 

    if (nanosleep(&req, &rem) == -1) { 
     if (errno == EINTR) 
      return (long)rem.tv_sec * 1000L + rem.tv_nsec/1000000L; 
     else 
      return ms; 
    } else 
     return 0L; 
} 

这是没有必要置零rem,同上,但这样写,这两个功能是非常强大的,甚至对偶尔的系统呃逆或库错误。

0

使用此宏暂停非整秒:

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