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. }

执行结果如下:

相关文章
|
10天前
|
存储 安全 关系型数据库
Linux系统在服务器领域的应用与优势###
本文深入探讨了Linux操作系统在服务器领域的广泛应用及其显著优势。通过分析其开源性、安全性、稳定性和高效性,揭示了为何Linux成为众多企业和开发者的首选服务器操作系统。文章还列举了Linux在服务器管理、性能优化和社区支持等方面的具体优势,为读者提供了全面而深入的理解。 ###
|
3月前
|
Unix Linux Ruby
在windows和linux上高效快捷地发布Dash应用
在windows和linux上高效快捷地发布Dash应用
|
3月前
|
Linux iOS开发 开发者
跨平台开发不再难:.NET Core如何让你的应用在Windows、Linux、macOS上自如游走?
【8月更文挑战第28天】本文提供了一份详尽的.NET跨平台开发指南,涵盖.NET Core简介、环境配置、项目结构、代码编写、依赖管理、构建与测试、部署及容器化等多个方面,帮助开发者掌握关键技术与最佳实践,充分利用.NET Core实现高效、便捷的跨平台应用开发与部署。
134 3
|
3月前
|
Linux 调度
Linux0.11 信号(十二)(下)
Linux0.11 信号(十二)
25 1
|
3月前
|
存储 Unix Linux
Linux0.11 信号(十二)(上)
Linux0.11 信号(十二)
30 0
|
3月前
|
存储 Linux 网络安全
【Azure App Service】.NET代码实验App Service应用中获取TLS/SSL 证书 (App Service Linux/Linux Container)
【Azure App Service】.NET代码实验App Service应用中获取TLS/SSL 证书 (App Service Linux/Linux Container)
|
3月前
|
JavaScript Linux
【Azure App Service for Linux】NodeJS镜像应用启动失败,遇见 RangeError: Incorrect locale information provided
【Azure App Service for Linux】NodeJS镜像应用启动失败,遇见 RangeError: Incorrect locale information provided
|
3月前
|
JavaScript Linux API
【Azure 应用服务】NodeJS Express + MSAL 应用实现AAD集成登录并部署在App Service Linux环境中的实现步骤
【Azure 应用服务】NodeJS Express + MSAL 应用实现AAD集成登录并部署在App Service Linux环境中的实现步骤
|
3月前
|
前端开发 JavaScript Linux
【Azure 应用服务】在Azure App Service for Linux环境中,部署的Django应用,出现加载css、js等静态资源文件失败
【Azure 应用服务】在Azure App Service for Linux环境中,部署的Django应用,出现加载css、js等静态资源文件失败
|
3月前
|
Linux
Linux0.11 文件打开open函数(五)
Linux0.11 文件打开open函数(五)
44 0