sleep()C不返回正确的值

时间:2017-12-15 10:50:42

标签: c sleep

我正在做一个学校项目(需要在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,则执行一次。

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

2 个答案:

答案 0 :(得分:2)

Per the manual

  

说明

     

sleep()导致调用线程休眠,直到数字为止   以秒为单位指定的实时秒数或直到a   信号到达时不会被忽略。

     

返回值

     

如果请求的时间已过,则为零,或秒数   如果呼叫被信号处理程序中断,则进入休眠状态。

您对alarm()的使用几乎肯定会中断您的sleep()来电。

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

答案 1 :(得分:0)

仅使用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()的方法更好。