自实现睡眠函数

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 }
时间: 2024-10-26 02:55:02

自实现睡眠函数的相关文章

Windows下编程2----- C语言常用函数举例

几个小函数 1.????//MessageBoxA(0,"网络故障,重新登录","qq error",3); //弹出对话框 2.????//ShellExecuteA(0,"open","notepad",0,0,6);????//执行指令 notepad可以指定网址 ? 3.????//malloc(100000);//吃内存,铲食 ????//Sleep(100); 4.获取当前时间并打印 方法一: ????SYSTEM

ARM linux电源管理——Cortex A系列CPU(32位)睡眠和唤醒的底层汇编实现

ARM linux电源管理——Cortex A系列CPU(32位)睡眠和唤醒的底层汇编实现 承接 http://www.wowotech.net/pm_subsystem/suspend_and_resume.html Linux电源管理(6)_Generic PM之Suspend功能一文中的下图. 本文主要分析平台相关的CPU睡眠和唤醒,即下电和上电流程,以及ARM底层汇编代码实现. 内核版本:3.1.0               CPU:ARM Cortex-A7 1 平台相关函数执行流程

Linux时间类型、函数和休眠函数

        转载请注明出处: http://blog.csdn.net/luotuo44/article/details/39374759 本文主要涉及Linux时间类型.时间函数以及Linux提供的睡眠函数. 时间类型和对应的函数: time_t: 最不陌生的时间类型恐怕是time_t这个类型了吧.它出现在C语言的标准库.但ISO C中并没有规定time_t是什么类型.范围以及精度,不过在POSIX中一般是被实现为有符号的整型. time_t的单位是秒.函数time()的返回值就是一个ti

Ember endDevice 功耗/睡眠机制

参考转自 https://www.sekorm.com/news/9339.html EFR32MG本身具有五种低功耗工作模式: EM0:Active状态,此时CPU活动.外设活动,功耗最高,最低65uA/MHz. EM1:IDLE状态,此时,CPU停止,外设活动,功耗和所使用的外设有关,一般可以认为此时3mA~5mA左右的功耗. EM2:Deepsleep状态,此时,部分LFXO或LFRCO.ULFRCO低速时钟的外设活动,RAM保存,标称此时电流为1.5uA. EM3:Stop状态,此时高速

读取bq26500电池电量 Driver

bq26500是用于锂离子电池.锂聚合物电池充电.放电控制和监控的集成电路芯片.利用它能够准确提供电池充电.放电.电池温度.充放电电压.电池电量等相关数据.不须要外接微处理器參与电池充电.放电等相关数据的计算. 本文简单的读取了电池的电量百分比和电压.如要读取其它參数依照datasheet给出的寄存器一一读取就可以. 连接示意图: 引脚pack+ 和 pack-分别连接正极和负极用来冲放电,HDQ是数据交互引脚,用来读取电池的參数,一般用一个gpio连接就能够. 时序图: 看图可知.逻辑1和0并

两个小算法

1.现在有100元,公鸡5元每只,母鸡3元每只,小鸡1元每只,要求三种鸡都必须买,并且正好100元花完,三种鸡加起来凑足100只. 我们可以假设公鸡为x只,母鸡为y只,小鸡为z只. 百鸡百钱算法 #include<stdio.h> #include<stdlib.h> void main(){ __asm{xor eax,eax} for(size_t x=1,x<20;x++){ for(size_t y=1;i<33;y++){ int z=100-x-y; if(

LINUX实现父子进程轮流修改文件的值

本例子是基于信号的同步机制实现父子进程轮流修改文件中的值. tatic volatile sig_atomic_t sigflag; static sigset_t newmask,oldmask,zeromask; static void sig_usr(int signo) { sigflag=1; } void TELL_WAIT(void) { if(signal(SIGUSR1,sig_usr)==SIG_ERR) perror("signal error"); if(sig

Linux内核中等待队列的几种用法

Linux内核里的等待队列机制在做驱动开发时用的非常多,多用来实现阻塞式访问,下面简单总结了等待队列的四种用法,希望对读者有所帮助. 1. 睡眠等待某个条件发生(条件为假时睡眠): 睡眠方式:wait_event, wait_event_interruptible 唤醒方式:wake_up (唤醒时要检测条件是否为真,如果还为假则继续睡眠,唤醒前一定要把条件变为真) 2. 手工休眠方式一: 1)建立并初始化一个等待队列项 DEFINE_WAIT(my_wait) <==> wait_queue

tcpreplay工具使用

参考:http://www.cnblogs.com/jiayy/p/3447047.html   速率控制算法的大体思路就是,通过适当的sleep,增加包发送的时间,从而减小算出来的速率,以达到用户设定的(小于机器最大速率)的某个速率.   常用的参数说明 -x, --multiplier=str   以抓包速率的一定比率发packet -p, --pps=num      每秒packet -M, --mbps=str     每秒兆比特 -t, --topspeed      全速(不做任何