我正在做一个学校项目(需要在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,则执行一次。
你能告诉我为什么会这样吗?
答案 0 :(得分:2)
说明
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()
的方法更好。