Linux系统应用编程 --- 信号处理函数(sigaction实现信号捕捉设定)

简介: Linux系统应用编程 --- 信号处理函数(sigaction实现信号捕捉设定)

sigaction实现信号捕捉

1. #include <signal.h>
2. 
3. int sigaction(int signum, const struct sigaction *act, struct sigaction *oldact);

struct sigaction 定义:

1. struct sigaction {
2. 
3. void (*sa_handler)(int);
4. 
5. void (*sa_sigaction)(int, siginfo_t *, void *);
6. 
7. sigset_t sa_mask;
8. 
9. int sa_flags;
10. 
11. void (*sa_restorer)(void);
12. 
13. };

sa_handler : 早期的捕捉函数

sa_sigaction : 新添加的捕捉函数,可以传参 , 和sa_handler互斥,两者通过sa_flags选择采用哪种捕捉函数。sa_handler和sa_sigaction只能使用一个

sa_mask : 在执行捕捉函数时,设置阻塞其它信号,sa_mask | 进程阻塞信号集,退出捕捉函数后,还原回原有的阻塞信号集

sa_flags : SA_SIGINFO 或者 0

sa_restorer : 保留,已过时

 

程序:程序一直在标准输入中读取字符,直到SIGUSR1和SIGUSR2注册处理函数打断

注:前32个经典Unix信号中,处理SIGUSR1和SIGUSR2未给出明确定义(也就是说用户可以自定义这两个信号),其余信号均有明确定义

1. #include <stdio.h>
2. #include <unistd.h>
3. #include <signal.h>
4. #include <errno.h>
5. 
6. static void sig_usr(int signum)
7. {
8. if(signum == SIGUSR1)
9.     {
10.         printf("SIGUSR1 received\n");
11.     }
12. else if(signum == SIGUSR2)
13.     {
14.         printf("SIGUSR2 received\n");
15.     }
16. else
17.     {
18.         printf("signal %d received\n", signum);
19.     }
20. }
21. 
22. int main(void)
23. {
24.     char buf[512];
25.     int  n;
26.     struct sigaction sa_usr;
27.     sa_usr.sa_flags = 0;
28.     sa_usr.sa_handler = sig_usr;   //信号处理函数
29. 
30.     sigaction(SIGUSR1, &sa_usr, NULL);
31.     sigaction(SIGUSR2, &sa_usr, NULL);
32. 
33.     printf("My PID is %d\n", getpid());
34. 
35.     while(1)
36.     {
37. if((n = read(STDIN_FILENO, buf, 511)) == -1)
38.         {
39. if(errno == EINTR)
40.             {
41.                 printf("read is interrupted by signal\n");
42.             }
43.         }
44. else
45.         {
46.             buf[n] = '\0';
47.             printf("%d bytes read: %s\n", n, buf);
48.         }
49.     }
50. 
51. return 0;
52. }

执行结果如下:

相关文章
|
Ubuntu Linux Anolis
Linux系统禁用swap
本文介绍了在新版本Linux系统(如Ubuntu 20.04+、CentOS Stream、openEuler等)中禁用swap的两种方法。传统通过注释/etc/fstab中swap行的方式已失效,现需使用systemd管理swap.target服务或在/etc/fstab中添加noauto参数实现禁用。方法1通过屏蔽swap.target适用于新版系统,方法2通过修改fstab挂载选项更通用,兼容所有系统。
1005 3
Linux系统禁用swap
|
Linux
Linux系统修改网卡名为eth0、eth1
在Linux系统中,可通过修改GRUB配置和创建Udev规则或使用systemd链接文件,将网卡名改为`eth0`、`eth1`等传统命名方式,适用于多种发行版并支持多网卡配置。
1607 3
|
Ubuntu Linux 网络安全
Linux系统初始化脚本
一款支持Rocky、CentOS、Ubuntu、Debian、openEuler等主流Linux发行版的系统初始化Shell脚本,涵盖网络配置、主机名设置、镜像源更换、安全加固等多项功能,适配单/双网卡环境,支持UEFI引导,提供多版本下载与持续更新。
1101 3
Linux系统初始化脚本
|
安全 Linux Shell
Linux系统提权方式全面总结:从基础到高级攻防技术
本文全面总结Linux系统提权技术,涵盖权限体系、配置错误、漏洞利用、密码攻击等方法,帮助安全研究人员掌握攻防技术,提升系统防护能力。
1228 1
|
缓存 Linux 测试技术
安装【银河麒麟V10】linux系统--并挂载镜像
安装【银河麒麟V10】linux系统--并挂载镜像
10167 0
|
关系型数据库 MySQL Linux
卸载、下载、安装mysql(Linux系统centos7)
卸载、下载、安装mysql(Linux系统centos7)
727 0
|
Linux
手把手教会你安装Linux系统
手把手教会你安装Linux系统
469 0
|
Linux 虚拟化 数据安全/隐私保护
部署05-VMwareWorkstation中安装CentOS7 Linux操作系统, VMware部署CentOS系统第一步,下载Linux系统,/不要忘, CentOS -7-x86_64-DVD
部署05-VMwareWorkstation中安装CentOS7 Linux操作系统, VMware部署CentOS系统第一步,下载Linux系统,/不要忘, CentOS -7-x86_64-DVD
|
Ubuntu Linux 网络安全
从头安装Arch Linux系统
本文记录了作者安装Arch Linux系统的过程,包括安装成果展示和遇到的疑难点及其解决方法,如硬盘不足、下载失败、设置时区、安装微码和配置无密码登录等。
858 1
从头安装Arch Linux系统
|
存储 NoSQL Java
使用redis进行手机验证码的验证、每天只能发送三次验证码 (redis安装在虚拟机linux系统中)
该博客文章展示了如何在Linux虚拟机上使用Redis和Jedis客户端实现手机验证码的验证功能,包括验证码的生成、存储、验证以及限制每天发送次数的逻辑,并提供了测试结果截图。
使用redis进行手机验证码的验证、每天只能发送三次验证码 (redis安装在虚拟机linux系统中)