如何在C中暂停非整数时间?
我正在编写一个简单的程序,当我将一个非整数值传递给sleep()函数时,它会给我一个错误。是否有另一个函数或使用sleep()的另一种方法允许我将程序暂时暂停不到一秒钟(或者说2.5秒) mario.c:34:13:错误:函数“usleep”的隐式声明在C99[-Werror,-Wimplicit函数声明]中无效如何在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 <
美国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)