首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >clock_nanosleep():它忽略timespec结构

clock_nanosleep():它忽略timespec结构
EN

Stack Overflow用户
提问于 2021-01-19 13:16:06
回答 2查看 159关注 0票数 0

我正在尝试创建这个基本的clock_nanosleep示例,但是它不会暂停我的for循环,该循环一直在打印数字。如果取消对//t.tv_nsec = s/1000000000;的注释,则不会打印任何内容,但for循环将运行。

代码语言:javascript
复制
// POSIX.1-2017 is what compiler is confined to.
#define _XOPEN_SOURCE 700

// C headers.
#include <stdint.h>
#include <time.h>
#include <stdio.h>
   
int main(int argc, char *argv[])
{
    // Counter.
    uint8_t i;

    // Time.
    int s = 1;

    // Create a timespec structure and calculate it's members.
    struct timespec t;
    t.tv_sec = s;
    //t.tv_nsec = s/1000000000;

    // Set flags i.e. TIMER_ABSTIME to 0 to use relative instead of absolute time.
    int flags = 0;

    // Choose the clock i.e. CLOCK_MONOTONIC is a "clock_id" for the clock started at system start.
    int clock_id = CLOCK_MONOTONIC;

    for(i = 0; i < 256; i++){
        printf("%d", i);

        // Because last argument is NULL in case of error, remaining time is not stored in "t".
        clock_nanosleep(clock_id, flags, &t, NULL);
    }

    return 0;

}

我完全不知道为什么这不管用。“POSIX”指出:

int clock_nanosleep(clockid_t clock_id, int flags, const struct timespec *rqtp, struct timespec *rmtp);

如果标志TIMER_ABSTIME未在标志参数中设置,则clock_nanosleep()函数将导致当前线程暂停执行,直到rqtp参数指定的时间间隔过去,或将信号传递到调用线程,其操作是调用信号捕获函数,或终止进程。

我确保旗子是零的。我设置了rqtp,即&t

用于测量时间的时钟应是clock_id指定的时钟。

我确实使用了CLOCK_MONOTONIC

如果clock_nanosleep()函数由于被信号中断而返回,它将返回相应的错误值。对于相对的clock_nanosleep()函数,如果rmtp参数是非NULL的,则应该更新由它引用的timespec结构,以包含间隔中的剩余时间(请求的时间减去实际的睡眠时间)。rqtprmtp参数可以指向同一个对象。如果rmtp参数是NULL,则不返回剩余时间。绝对clock_nanosleep()函数对rmtp引用的结构没有影响。

我还将最后一个参数设置为NULL,以便在clock_naanosleep()被任何信号中断时不存储剩余时间。

为什么这不管用?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-01-19 13:29:35

局部变量不是隐式初始化的。因此,如果不设置t.tv_nsec,它可能包含任何值。如果该值恰好超出了0- 999999999的范围,那么clock_nanosleep将立即返回错误代码。

设置t.tv_nsec时没有看到任何输出的原因是由于您的打印方式:

代码语言:javascript
复制
 printf("%d", i);

在输出中不包括换行符。stdout流是行缓冲的,因此不会自动将输出流刷新到控制台。将\n添加到格式字符串的末尾,您将看到打印的行。

票数 2
EN

Stack Overflow用户

发布于 2021-01-19 13:27:38

在这种情况下,您应该始终检查实际返回值是什么,在本例中是EINVAL,因为t.tv.nsec没有初始化。

使用:

代码语言:javascript
复制
struct timespec t = {
    .tv_sec = s,
};

正确初始化所有字段,即使是不打算使用的字段。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65792258

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档