zoukankan      html  css  js  c++  java
  • 自实现睡眠函数

    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
    ");
    14         return -1;
    15     }
    16     //永久睡眠,每隔n妙醒一次;
    17     while(1)
    18     {
    19         mysleep((unsigned int)atoi(argv[1]));   //睡眠时间:命令行的第二个参数,睡醒之后,打印;
    20         printf("---------sleep %d s late
    ",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
    ");
    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==========
    ");
    56 }
  • 相关阅读:
    数据结构与算法(二)(栈、队列)
    数据结构与算法(一)(数组、线性查找、二分查找)
    ssm项目中常用的上传文件
    安全防御之防xss、SQL注入、与CSRF攻击
    int i=i++;和i=++i;和i++
    关于@Autowired和@Resource注解区别
    通过idea创建Maven项目整合Spring+spring mvc+mybatis
    深入理解java虚拟机(一)
    java中栈,堆,方法区
    SpringBoot+mybatis配置pagehelper实现基础分页
  • 原文地址:https://www.cnblogs.com/yyx1-1/p/5854927.html
Copyright © 2011-2022 走看看