• Linux 信号 alarm函数 setitimer函数


    1. /*
    2. #include <unistd.h>
    3. unsigned int alarm(unsigned int seconds);
    4. 功能:设置定时器。函数调用,开始倒计时,0的时候给当前的进程发送SIGALARM信号
    5. 参数:倒计时的时长。。单位:秒 如果参数为0,无效
    6. 返回值:倒计时剩余的时长
    7. -之前没有定时器,返回0
    8. -之前有定时器,返回之前的定时器剩余的时间
    9. SIGALARM:默认终止当前的进程,每一个进程有且仅有唯一的定时器
    10. 函数不阻塞
    11. */
    12. #include<stdio.h>
    13. #include<unistd.h>
    14. int main() {
    15. int second = alarm(5);
    16. printf("seconds = %d\n", second);
    17. sleep(2);
    18. second = alarm(2);
    19. printf("seconds = %d\n", second);
    20. while(1){
    21. }
    22. return 0;
    23. }

    后面新设的定时器会取代老的定时器

    定时与进程的状态无关,无论进程是阻塞,挂起,就绪,运行定时器都是自己玩自己的

    setitimer函数

    1. /*
    2. #include <sys/time.h>
    3. int setitimer(int which, const struct itimerval *new_value, struct itimerval *old_value);
    4. 功能:设置定时器(闹钟)。可以替代alarm函数。精度微秒,可以实现周期性的定时。
    5. 参数:
    6. -which:定时器以什么方式计时
    7. -ITIMER_REAL:真实时间,时间到达,发送SIGALRM 常用
    8. -ITIMER_VIRTUAL:用户时间,时间到达,发送SIGVTALRM
    9. -ITIMER_PROF:一该进程在用户态和内核态下所消耗的时间来计算,时间到达,发送SIGPROF信号
    10. -new_value:设置定时器的属性
    11. struct itimerval {
    12. struct timeval it_interval; 每个阶段的倒计时时长
    13. struct timeval it_value; 延迟多长时间执行定时器
    14. };
    15. struct timeval {
    16. time_t tv_sec; 秒数
    17. suseconds_t tv_usec; 微秒
    18. };
    19. -old_value:记录上次定时的时间参数
    20. 返回值:成功0 失败-1
    21. */
    22. #include <sys/time.h>
    23. #include<stdio.h>
    24. #include<unistd.h>
    25. int main() {
    26. struct itimerval new_value;
    27. new_value.it_interval.tv_sec = 2;
    28. new_value.it_interval.tv_usec = 0;
    29. new_value.it_value.tv_sec = 3;
    30. new_value.it_value.tv_usec = 0;
    31. int ret = setitimer(ITIMER_REAL, &new_value, NULL);
    32. printf("开始\n");
    33. if(ret == -1) {
    34. perror("ret");
    35. return 0;
    36. }
    37. while(1) {
    38. printf("1\n");
    39. sleep(1);
    40. }
    41. return 0;
    42. }

    延迟三秒开始执行就会立马发送信号,然后每隔两秒发送一次

  • 相关阅读:
    大聪明教你学Java | 在支付模块中如何防止掉单和重复支付
    读书笔记:多Transformer的双向编码器表示法(Bert)-3
    HTML核心(1)- 第一个网页
    Design Master V0.1发布--文本转图像接口
    Python手册
    后端开发人员的Docker入门与实践指南
    【dotnet】dotnet和mono及跨平台实现原理及案例(重要)
    湖仓一体技术解读|列存+微分区优化,分析性能10倍提升
    深度学习踩坑笔记:载入内存,数据分配与重启问题,安装R
    低代码与传统开发:综合比较
  • 原文地址:https://blog.csdn.net/weixin_44273624/article/details/132988262