Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在C到毫秒之间是否有其他睡眠功能?_C_Linux_Sleep - Fatal编程技术网

在C到毫秒之间是否有其他睡眠功能?

在C到毫秒之间是否有其他睡眠功能?,c,linux,sleep,C,Linux,Sleep,我有一些在Windows上编译的源代码。我正在将其转换为在Red Hat Linux上运行 源代码包含头文件,程序员使用Sleep()函数等待毫秒。这在Linux上不起作用 但是,我可以使用sleep(seconds)函数,但它使用的是以秒为单位的整数。我不想把毫秒转换成秒。在Linux上编译gcc时是否可以使用其他睡眠功能?是-定义了较旧的标准,因此在Linux上可以使用: 描述 函数的作用是:挂起调用线程的执行 (至少)usec微秒。睡眠时间可以稍微延长一点 任何系统活动或处理呼叫所花费的时

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

源代码包含
头文件,程序员使用
Sleep()
函数等待毫秒。这在Linux上不起作用

但是,我可以使用
sleep(seconds)
函数,但它使用的是以秒为单位的整数。我不想把毫秒转换成秒。在Linux上编译gcc时是否可以使用其他睡眠功能?

是-定义了较旧的标准,因此在Linux上可以使用:

描述

函数的作用是:挂起调用线程的执行 (至少)usec微秒。睡眠时间可以稍微延长一点 任何系统活动或处理呼叫所花费的时间,或 系统计时器的粒度

usleep()


usleep();对于新代码,最好是:

示例
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;
}
#包括
#包括
/*msleep():按请求的毫秒数休眠*/
int msleep(长毫秒)
{
结构timespects;
国际关系;
如果(毫秒<0)
{
errno=EINVAL;
返回-1;
}
ts.tv_sec=毫秒/1000;
ts.tv_nsec=(毫秒%1000)*1000000;
做{
res=纳米睡眠(&ts,&ts);
}while(res&&errno==EINTR);
返回res;
}
除此之外,humble with NULL file descriptor set将允许您以微秒的精度暂停,并且不会出现
SIGALRM
并发症的风险

提供类似的行为。

#包括
#include <unistd.h>

int usleep(useconds_t useconds); //pass in microseconds
int usleep(使用秒\u t使用秒)//以微秒为单位传递
作为POSIX 2008中未定义的标准的替代,POSIX 2008标准定义了:

nanosleep
-高分辨率睡眠

#include <time.h>
int nanosleep(const struct timespec *rqtp, struct timespec *rmtp);
#包括
int nanosleep(const-struct-timespec*rqtp,struct-timespec*rmtp);
nanosleep()
函数应使当前线程暂停执行,直到
rqtp
参数指定的时间间隔过去或向调用线程发送信号,其操作是调用信号捕获函数或终止进程。暂停时间可能比请求的时间长,因为参数值被四舍五入到睡眠分辨率的整数倍,或者因为系统安排了其他活动。但是,除被信号中断的情况外,暂停时间不得小于由系统时钟实时测量的
rqtp
规定的时间

使用
nanosleep()
功能不会影响任何信号的动作或阻塞


您可以使用此跨平台功能:

#ifdef WIN32
#include <windows.h>
#elif _POSIX_C_SOURCE >= 199309L
#include <time.h>   // for nanosleep
#else
#include <unistd.h> // for usleep
#endif

void sleep_ms(int milliseconds){ // cross-platform sleep function
#ifdef WIN32
    Sleep(milliseconds);
#elif _POSIX_C_SOURCE >= 199309L
    struct timespec ts;
    ts.tv_sec = milliseconds / 1000;
    ts.tv_nsec = (milliseconds % 1000) * 1000000;
    nanosleep(&ts, NULL);
#else
    if (milliseconds >= 1000)
      sleep(milliseconds / 1000);
    usleep((milliseconds % 1000) * 1000);
#endif
}
#ifdef WIN32
#包括
#elif\u POSIX\u C\u来源>=199309L
#包括//用于纳米睡眠
#否则
#包括//用于usleep
#恩迪夫
void sleep_ms(整数毫秒){//跨平台睡眠函数
#ifdef WIN32
睡眠(毫秒);
#elif\u POSIX\u C\u来源>=199309L
结构timespects;
ts.tv_sec=毫秒/1000;
ts.tv_nsec=(毫秒%1000)*1000000;
奈米睡眠(&ts,空);
#否则
如果(毫秒>=1000)
睡眠(毫秒/1000);
usleep((毫秒%1000)*1000);
#恩迪夫
}
#包括
#包括
int main(){
puts(“程序将休眠2秒”);
system(“sleep 2”);//适用于linux系统
返回0;
}

当我们没有
\u POSIX\u C_SOURCE>=199309L
时,就像
-ansi
-std=c89
一样,我建议使用
结构timeval tv;tv.tv_sec=毫秒/1000;tv.tv_usec=毫秒%1000*1000;选择(0、NULL、NULL、NULL和tv)而不是
usleep(毫秒*1000)。功劳去了,回答得很好!注意,以下是
nanosleep()
文档:。发布此处使用的每个特定于平台的函数的文档链接将非常有用。还请注意,在Linux Ubuntu上,使用gcc 4.8.4版,使用
gcc-Wall-g3-std=c11-o sleep\u test sleep\u test.c&./sleep\u test编译时,我得到以下警告:
警告:函数的隐式声明'usleep'[-Wimplicit函数声明]
。解决方案是在代码的最顶端添加以下两个定义:1)
\define\u USE\u POSIX199309
和2)
\define\u POSIX\u SOURCE 199309L
。这两个定义都是在没有任何警告的情况下编译代码所必需的(同时也需要使用
纳秒()
function,它已经提供了)。我刚刚做出的相关回答是:这很酷。具有讽刺意味的是,我总是使用windows机器,但使用WSL来编写C,我在leetcode上,我希望他们使用Linux,但他们似乎在使用windows,因为睡眠只需几秒钟,但你的代码可以处理向它抛出的任何东西
sleep(/*seconds*/)
中的
可以工作,但是如果我使用
printf(“某些东西”)
而不使用
\n
,则不工作。在这种情况下,我们必须在每次
printf()之后使用
fflush(stdout);
刷新输出
“没有sigalarm的风险”:哪种风险和哪种情况?调用sleep和usleep?@Massimo,usleep的链接规范中有几句关于未指定的sigalarm行为。(基本上,usleep和sleep可以通过旧的报警机制来实现,你可以想象这会使usleep和SIGALARM的安全使用变得复杂
#include <unistd.h>

int usleep(useconds_t useconds); //pass in microseconds
#include <time.h>
int nanosleep(const struct timespec *rqtp, struct timespec *rmtp);
#ifdef WIN32
#include <windows.h>
#elif _POSIX_C_SOURCE >= 199309L
#include <time.h>   // for nanosleep
#else
#include <unistd.h> // for usleep
#endif

void sleep_ms(int milliseconds){ // cross-platform sleep function
#ifdef WIN32
    Sleep(milliseconds);
#elif _POSIX_C_SOURCE >= 199309L
    struct timespec ts;
    ts.tv_sec = milliseconds / 1000;
    ts.tv_nsec = (milliseconds % 1000) * 1000000;
    nanosleep(&ts, NULL);
#else
    if (milliseconds >= 1000)
      sleep(milliseconds / 1000);
    usleep((milliseconds % 1000) * 1000);
#endif
}
#include <stdio.h>
#include <stdlib.h>
int main () {

puts("Program Will Sleep For 2 Seconds");

system("sleep 2");      // works for linux systems


return 0;
}