C++ 为什么在创建posix计时器时使用睡眠?

C++ 为什么在创建posix计时器时使用睡眠?,c++,multithreading,posix,C++,Multithreading,Posix,我正在努力学习posix的定时器。我以linux手册页为例。手册页创建计时器,然后使用sleep使计时器进入睡眠状态。如果使用睡眠,为什么要创建计时器?这是手册页中的代码 if (timer_create(clockid, &sev, &timerid) == -1) { errExit("timer_create"); } freq_nanosecs = atoll(argv[2]); its.it_value.tv_sec = freq_n

我正在努力学习posix的定时器。我以linux手册页为例。手册页创建计时器,然后使用sleep使计时器进入睡眠状态。如果使用睡眠,为什么要创建计时器?这是手册页中的代码

    if (timer_create(clockid, &sev, &timerid) == -1) {
    errExit("timer_create");
}



freq_nanosecs = atoll(argv[2]);
       its.it_value.tv_sec = freq_nanosecs / 1000000000;
       its.it_value.tv_nsec = freq_nanosecs % 1000000000;
       its.it_interval.tv_sec = its.it_value.tv_sec;
       its.it_interval.tv_nsec = its.it_value.tv_nsec;

       /* Sleep for a while; meanwhile, the timer may expire
          multiple times */
 if (timer_settime(timerid, 0, &its, NULL) == -1)
     errExit("timer_settime");


       printf("Sleeping for %d seconds\n", atoi(argv[1]));
       sleep(atoi(argv[1]));

因为如果您的程序没有其他事情要做(即没有主事件循环),那么它将在到达该块末尾时退出。如果您注释掉sleep(),它将立即退出

您可以用while(1)代替sleep(atoi(argv[1])

基本上,您的程序已经用完了要运行的指令。计时器通常用于以异步方式发送信号等操作。例如,您可以设置计时器以向流程发送信号,并设置信号处理程序以处理该事件


为了更清楚,我想说看timer_create(2),但看起来像是你直接从那里粘贴了一些代码。

看来你在关于
std::sleep
的实际行为的一些基本概念上犯了严重错误!检查异步定时器的实现情况…你能解释一下吗?我知道我误解了发生的事情。你能解释一下吗?对不起,不!我不知道
timer\u settime(…
)是什么意思,你从哪里得到的(或者
timerid
)。放一个来重现你的问题(我不是已经向你提到过这个,可能是为了一个不同的问题吗??)看看你给出的示例片段,只是使用
sleep()
为了异步显示计时器的s.th.。我只是使用了linux手册页中的内容。我不知道如何做,我尝试了他们的示例。它似乎不起作用,我会查找它。如果我没有选择,我会来这里。我直接从手册页复制了这个。我想我提到过。我该如何使用while(1);我想做while(timer),但我很难确定我应该使用timer\u settime还是timer\u gettime。我尝试了这两种方法,但都没有效果。我的重点是你的程序必须做些什么——睡眠或空while循环只是它在手册页示例中保持运行的一种方式。你必须使用timer\u create()来实例化它和timer\u settime()来启动它。如果你能确切地说明你想做什么,我可以提供一个更合适的答案。你不需要在创建计时器时使用sleep()。我使用timer\u Create()和timer\u settime()。我在我的问题中添加了代码示例你真的调用timer\u settime()吗两次?结构itimerspec是在第一次调用中初始化的吗?无论如何,我还是看不出您在尝试做什么。这是手册页中的一个框架示例。