我正在尝试创建这个基本的clock_nanosleep示例,但是它不会暂停我的for循环,该循环一直在打印数字。如果取消对//t.tv_nsec = s/1000000000;的注释,则不会打印任何内容,但for循环将运行。
// 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结构,以包含间隔中的剩余时间(请求的时间减去实际的睡眠时间)。rqtp和rmtp参数可以指向同一个对象。如果rmtp参数是NULL,则不返回剩余时间。绝对clock_nanosleep()函数对rmtp引用的结构没有影响。
我还将最后一个参数设置为NULL,以便在clock_naanosleep()被任何信号中断时不存储剩余时间。
为什么这不管用?
发布于 2021-01-19 13:29:35
局部变量不是隐式初始化的。因此,如果不设置t.tv_nsec,它可能包含任何值。如果该值恰好超出了0- 999999999的范围,那么clock_nanosleep将立即返回错误代码。
设置t.tv_nsec时没有看到任何输出的原因是由于您的打印方式:
printf("%d", i);在输出中不包括换行符。stdout流是行缓冲的,因此不会自动将输出流刷新到控制台。将\n添加到格式字符串的末尾,您将看到打印的行。
发布于 2021-01-19 13:27:38
在这种情况下,您应该始终检查实际返回值是什么,在本例中是EINVAL,因为t.tv.nsec没有初始化。
使用:
struct timespec t = {
.tv_sec = s,
};正确初始化所有字段,即使是不打算使用的字段。
https://stackoverflow.com/questions/65792258
复制相似问题