首页 > 代码库 > 自实现睡眠函数
自实现睡眠函数
1.这段代码注意的地方:
alarm() 函数不是阻塞函数,定时之后,程序会继续往下运行;
pause() 阻塞函数,函数被调用调用后,主动造成程序挂起。
2.这个地方很容易想歪;当时的问题是这样:
加入该程序在 执行完38 后失去CPU资源,那么当它再次获得CPU资源时且信号已经发出,程序会不会唤醒,答案是不会。
因为,alarm()函数采用自然定时法,当时间到后,信号已经由内核发出,假设此后程序才获得CPU资源,一开始,内核会先进行信号的处理,处理完信号后,再调起
pause()函数,这时因为信号已经发过并且处理完毕,它不会接收到信号,不会被唤醒,造成程序永久挂起。
当时的理解是这样,信号的处理与发送一直是由内核进行处理的, 不管pause函数调用与否;
1.所以,假如pause函数不调用,它就不会接收到信号, 不会被唤醒;
2.加入发出信号时,pause函数被系统调用,它就会接收到信号,被唤醒。
3.alarm函数调用后,程序会继续往下执行,不会停止,这个一定得理解正确。
1 #include<stdio.h> 2 #include<stdlib.h> 3 #include<unistd.h> 4 #include<signal.h> 5 #include<errno.h> 6 7 unsigned int mysleep(unsigned int seconds); 8 void do_sth(int a); 9 int main(int argc, char* argv[])10 {11 if(argc != 2)12 {13 printf("./a.out string\n");14 return -1;15 }16 //永久睡眠,每隔n妙醒一次;17 while(1)18 {19 mysleep((unsigned int)atoi(argv[1])); //睡眠时间:命令行的第二个参数,睡醒之后,打印;20 printf("---------sleep %d s late\n",atoi(argv[1]));21 }22 return 0;23 }24 25 unsigned int mysleep(unsigned int seconds)26 {27 int ret;28 unsigned int unusetime;29 30 //创建变量,给它赋值31 struct sigaction act, oldact;32 act.sa_handler = do_sth;33 act.sa_flags = 0;34 sigemptyset(&act.sa_mask);35 36 sigaction(SIGALRM, &act, &oldact); //设置捕捉函数37 38 alarm(seconds); //设置闹钟,注意,它不是阻塞函数,在这里会继续往下运行39 40 ret = pause(); //设置暂停函数,程序调用这个函数,陷入阻塞,等待信号的唤醒,必须是捕捉的信号。41 if(ret == -1 && errno == EINTR)42 {43 printf("have catch SIGALARM\n");44 }45 46 unusetime = alarm(0); //返回剩余的时间47 48 sigaction(SIGALRM, &oldact, NULL); //设置捕捉函数49 return unusetime;50 51 }52 53 void do_sth(int a)54 {55 printf("=======catch==========\n");56 }
自实现睡眠函数
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。