使用 sigaction 函数实现可靠信号
2024-10-20 03:15:15
前言
在前文中,讲述了一个可靠信号的示例。它分成几个步骤组成( 请参考前文 )。在 Linux 系统编程中,有个方法可以将这些步骤给集成起来,让我们使用起来更加的方便。那就是调用 sigaction 函数。
sigaction 函数
原型:int sigaction (int signo, const struct sigaction * restrict act, struct sigaction *restrict oact)
作用:将信号及其处理函数关联起来,但这个注册函数中,信号处理函数是放在一个结构体中的,这个结构体除了注册函数,还可以存放一些其他信息,以实现可靠信号机制:
其中,第一个字段是信号处理函数的地址;第二个字段是在接收到所等待的信号前,需要屏蔽的信号的信号集( 从信号处理函数返回之后就会恢复到原先的信号屏蔽字 );
另外两个字段一般设置为 0 和 NULL,用的比较少。
最后一个参数如果非空责将返回这个信号原本对应的的信号处理结构体。
代码实现
下面程序是一个使用 sigaction 函数实现可靠信号的示例:
#include <stdio.h>
#include <unistd.h>
#include <signal.h> static void sig_quit (int); int main (void) { // 初始化信号处理结构体
struct sigaction act;
act.sa_handler = sig_quit;
// 这一步可以根据需要,屏蔽指定的信号,其对应信号处理函数执行完毕以后,信号屏蔽字又会恢复到调用前的状态。
sigemptyset (&act.sa_mask);
act.sa_flags = ;
act.sa_sigaction = NULL; // 记得参数类型是引用类型!
if (sigaction (SIGQUIT, &act, NULL) < ) {
printf ("注册信号处理函数失败\n");
return ;
} // 在此阶段进入信号处理函数并返回后,不会继续挂起状态,而是进入到下一条语句。
sleep (); return ;
} static void sig_quit (int signo)
{
printf("捕捉到退出信号\n"); // 将对退出信号的处理设置为关闭进程
if (signal (SIGQUIT, SIG_DFL) == SIG_ERR) {
printf("设置退出信号处理函数失败\n");
}
}
运行测试
发现了一个问题:未打印” 捕捉到退出信号\n " ( 31 行 ),这个问题只能留待日后解决。
小结
sigaction 结构体的后两个参数的具体功能,请参阅相关资料。
最新文章
- hdu 5661 Claris and XOR
- Droid4x设置代理抓包
- PHP XDEBUG
- javascript util.js
- MySQL计划任务(事件调度器)(Event Scheduler)
- GinWin命令控制台执行指令
- .net 分页案例效果
- Using INSERT IGNORE with MySQL to prevent duplicate key errors
- 机器学习基础一(TP,TN,FP,FN等)
- 网络操作基础(two)
- ACM知识点分类
- 怎样将本地web项目部署到腾讯云服务器上?
- Python验证码识别 安装Pillow、tesseract-ocr与pytesseract模块的安装以及错误解决
- J S 脚本语言 if() { if { } else { } } var a =100; switch { case ( ) break ; } 基础详解 , 最下面有例子
- ThinkPHP 日志(如何学好一门技术,教学视频和文档的优缺)
- Head First Servlets &; JSP 学习笔记 第一章 —— 前言和体系结构
- MarkDownPad 专业汉化破解
- Linux jstack分析cpu占用100%
- python&#39;s output redirect
- DataFrame概念与创建