当前位置: 首页 > news >正文

Linux 信号捕捉函数 signal sigaction

signal函数

    #include <signal.h>

    typedef void (*sighandler_t)(int);

    sighandler_t signal(int signum, sighandler_t handler);

    功能:设置某个信号的捕捉行为

    参数:

        -signum:要捕捉的信号

        handler:对捕捉到的信号怎么处理

            -SIG_IGN:忽略信号

            -SIG_DFL:使用函数默认的行为

            -回调函数,程序员只负责写,捕捉到信号后如何区处理

                -需要程序员实现,提前准备好的,函数的类型根据实际需求,看函数指针的定义

                -不是程序员调用,而是当信号产生,内核调用

                -函数指针是实现回调的手段,函数实现之后,将函数名放到函数指针的位置就好了

    返回值:

        成功:返回上一次注册的信号处理函数的地址。第一次调用返回NULL

        失败:返回SIG_ERR,设置错误号

    SIGKILL 和 SIGSTOP不能被捕捉也不能被忽略

*/

#include <sys/time.h>
#include<stdio.h>
#include<unistd.h>
#include<signal.h>void myalarm(int num) {printf("捕捉到的信号的编号为 %d\n", num);printf("xxxxxxxxxxxx\n");
}int main() {signal(SIGALRM, myalarm);struct itimerval new_value;new_value.it_interval.tv_sec = 2;new_value.it_interval.tv_usec = 0;new_value.it_value.tv_sec = 3;new_value.it_value.tv_usec = 0;int ret = setitimer(ITIMER_REAL, &new_value, NULL);printf("开始\n");if(ret == -1) {perror("ret");return 0;}while(1) {printf("1\n");sleep(1);}return 0;
}

sigaction函数

#include <signal.h>

int sigaction(int signum, const struct sigaction *act, struct sigaction *oldact);

功能:检查或者改变信号的处理  信号捕捉

参数:-signum:要捕捉的信号的编号或者宏值

         -act 捕捉到信号之后的处理动作

         -oldact:上一次对信号捕捉相关的设置,一般不用,输入NULL

返回值:成功0失败-1

    struct sigaction {

               void     (*sa_handler)(int);  函数指针,指向的函数就是信号捕捉到之后的处理函数

               void     (*sa_sigaction)(int, siginfo_t *, void *);  不常用  同上

               sigset_t   sa_mask;  临时阻塞信号集,在信号捕捉函数执行过程中阻塞某些信号

               int        sa_flags;  指定是使用第一个参数还是第二个参数对信号进行处理 0表示使用sa_handler  siginfo表示第二个

               void     (*sa_restorer)(void);

           };

#include <sys/time.h>
#include<stdio.h>
#include<unistd.h>
#include<signal.h>void myalarm(int num) {printf("捕捉到的信号的编号为 %d\n", num); printf("xxxxxxxxxxxx\n");
}int main() {struct sigaction act;act.sa_handler = 0;act.sa_handler = myalarm;sigemptyset(&act.sa_mask);sigaction(SIGALRM, &act, NULL);struct itimerval new_value;new_value.it_interval.tv_sec = 2;new_value.it_interval.tv_usec = 0;new_value.it_value.tv_sec = 3;new_value.it_value.tv_usec = 0;int ret = setitimer(ITIMER_REAL, &new_value, NULL);printf("开始\n");if(ret == -1) {perror("ret");return 0;}while(1) {printf("1\n");sleep(1);}return 0;
}

尽可能使用sigaction     signal是美国那边编译的每个版本不太一样

http://www.lryc.cn/news/174521.html

相关文章:

  • StarRocks操作笔记
  • Linux的ls -ld命令产生的信息怎么看
  • Linux- 内存映射文件(Memory-Mapped File)
  • 李航老师《统计学习方法》第五章阅读笔记
  • iOS16新特性:实时活动-在锁屏界面实时更新APP消息 | 京东云技术团队
  • 使用 Elasticsearch、OpenAI 和 LangChain 进行语义搜索
  • NIFI集群_队列Queue中数据无法清空_清除队列数据报错_无法删除queue_解决_集群中机器交替重启删除---大数据之Nifi工作笔记0061
  • leetcode20. 有效的括号 [简单题]
  • ubuntu20.04下源码编译colmap
  • Jumpserver堡垒机
  • 第一百五十三回 如何实现滑动窗口
  • Oracle 12c自动化管理特性的新进展:自动备份、自动恢复和自动维护功能的优势|oracle 12c相对oralce 11g的新特性(3)
  • Redis——Jedis中hash类型使用
  • 肖sir__项目实战讲解__004
  • 数据库数据恢复-ORACLE常见故障有哪些?恢复数据的可能性高吗?
  • 合规性管理如何帮助产品团队按时交付?
  • 从平均数到排名算法
  • 如何使用ESP8266微控制器和Nextion显示器为Home Assistant展示温度传感器和互联网天气预报
  • 阻塞队列-生产者消费者模型
  • Vector Art - 矢量艺术
  • ruoyi-nbcio增加flowable流程待办消息的提醒,并提供右上角的红字数字提醒(一)
  • 数据结构:二叉树的基本概念
  • 利用Socks5代理IP加强跨界电商爬虫的网络安全
  • Spring学习笔记6 Bean的实例化方式
  • 大二毕设.3-网盘系统-用户模块讲解
  • (Vue2)智慧商城项目
  • Nginx实战
  • day-57 代码随想录算法训练营(19)动态规划 part 17
  • 在项目中,关于前端实现数据可视化的技术选择
  • DT 卡通材质学习 一