【问题标题】:sleep() C doesn't return the correct valuesleep() C 没有返回正确的值
【发布时间】:2017-12-15 10:50:42
【问题描述】:

我正在做一个学校项目(需要用 C 开发它),我需要它在程序执行开始后每 X 秒和 Y 秒执行一些代码,它必须结束。

所以我写了:

alarm(Y);
s=X;
while(!end){
    s = sleep(s); //because it generates some children that send signal to him and in that case i need to do other stuffs
    if(s == 0){
        //code to do each X seconds
    }
}

变量end是一个全局变量,初始化为0,当收到SIGALARM时,值变为1。

如果我有 X>Y,则不应执行每 X 秒执行一次的代码,但如果 X=Y+1 则执行一次。

你能告诉我为什么会这样吗?

【问题讨论】:

  • 我不是很清楚,我知道你的英文有问题,但是,你能用图形的吗?比如操作的时间线?
  • 如果连睡眠手册都说混合闹钟和睡眠是个坏主意,那你就别想这样做了。
  • @Pere 请问你是怎么得出结论的?

标签: c sleep


【解决方案1】:

Per the manual:

描述

sleep() 导致调用线程休眠,直到数字 以秒为单位指定的实时秒数已经过去或直到 信号到达,未被忽略。

返回值

如果请求的时间已经过去,则为零,或秒数 如果调用被信号处理程序中断,则进入睡眠状态。

您使用alarm() 几乎肯定会中断您的sleep() 呼叫。

即使alarm() 没有干扰,sleep() 也可能总是被信号打断,你必须妥善处理。

【讨论】:

    【解决方案2】:

    只需sleep()就很容易做到这一点:

    #include <stdio.h>
    #include <unistd.h>
    
    int main(void) {
      unsigned int const y = 5;
      unsigned int const x = 2;
    
      {
        unsigned int left = y;
        unsigned int action = 0;
        while (left > 0) {
          unsigned int time = x - action < left ? x - action : left;
          printf("I will sleep for %u\n", time);
          {
            unsigned ret = sleep(time);
    
            action += time - ret;
            if (action >= x) {
              printf("do something\n");
              action -= x;
            }
    
            left -= time - ret;
          }
        }
      }
    }
    

    但请注意,这显然不准确,有更好的方法 sleep() 与 POSIX 标准,如 clock_gettime()nanosleep()clock_nanosleep()

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-26
      • 2019-03-21
      • 1970-01-01
      • 2014-07-15
      • 1970-01-01
      相关资源
      最近更新 更多