我正在写一个简单的程序,当我将一个非整数值传递给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);
^
我正在写一个简单的程序,当我将一个非整数值传递给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);
^
这将让你指定延迟为几秒钟内浮动。
该函数执行直到开始和停止之间的差值大于请求的延迟时间。
#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();
}
}
usleep
将暂停特定的微秒数。例如:
usleep(500000);
会暂停半秒钟。
在某些系统上,并且根据编译器配置等,你可能需要包括unistd.h
之前定义_GNU_SOURCE
(理想情况下,在源文件的开头),有:
#define _GNU_SOURCE
睡眠()的int值是以毫秒为单位的暂停时间,而不是秒。所以,暂停一秒钟,你会通过它1000秒。2.5秒,你会通过它2500.半秒钟,你会通过500.
的明显问题与原来的建议,使用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]"
的usleep
和nanosleep
功能扩展,如上所述。更常见的是,使用select
或poll
。这些函数用于等待指定的时间间隔来执行一个或多个打开文件的活动。作为特殊情况,select
甚至不需要等待文件,而只是使用时间间隔。与nanosleep
类似,select
使用时间间隔的结构来允许双精度值 - 但其值范围以微秒开始,而nanosleep
以纳秒开始。
这些函数都是Linux C库的一部分。
ncurses(像任何X/Open curses)提供的函数napms
等待几毫秒。在内部,ncurses使用(自1998)nanosleep
或usleep
(取决于它们的可用性),还是使用select
或poll
(也取决于可用性)的内部函数。
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
,同上,但这样写,这两个功能是非常强大的,甚至对偶尔的系统呃逆或库错误。
使用此宏暂停非整秒:
#include "unistd.h"
#define mysleep(s) usleep(s*1000000)
你的Linux?视窗?还有别的吗? – 2015-03-24 21:53:22
您是否尝试过http://linux.die.net/man/3/usleep? – 2015-03-24 21:53:40
我认为他们中的大多数会让你使用毫秒(毫秒)。 – DigitalNinja 2015-03-24 21:54:30