Linux 使用sigaction查询或设置信号处理方式
一、概述
Linux的系统调用函数sigaction()可以用来查询或设置信号处理方式。
函数声明为:
#include <signal.h>int sigaction(int signum, const struct sigaction *act, struct sigaction *oldact);
如果执行成功返回0,否则返回-1。其中,参数表示的含义如下:
- signum:要操作的信号,指定除SIGKILL和SIGSTOP以外其所有信号。
- act:要设置的对信号的新处理方式,sigaction指针结构体
- oldact:原来对信号的处理方式
结构体struct sigaction描述对信号的处理,定义如下:
struct sigaction
{void (*sa_handler)(int);void (*sa_sigaction)(int,siginfo_t *,void *);sigset_t sa_mask;int sa_flags;void (*sa_restorer)(void);
}
在sigaction结构体中,参数表述如下:
- sa_handler:函数指针,指向一个信号处理函数
- sa_sigaction:获得关于信号的更详细信息
- sa_flags:成员的值包含SA_SIGINFO时,系统将使用sa_sigaction函数作为信号处理函数,否则使用sa_handler
- sa_mask:用来指定在信号处理函数执行期间需要被屏蔽的信号,信号自身会被自动放入进程的信号掩码,不会重复执行
sa_flags成员用于指定信号的处理行为,它可以是以下值的“按位或”组合。
- SA_RESTART:使被信号打断的系统调用自动重新发起
- SA_NOCLDSTOP:使父进程在它的子进程暂停或继续运行时不会收到SIGCHLD信号
- SA_NOCLDWAIT:使父进程在它的子进程退出时不会收到SIGCHLD信号,这时子进程如果也退出,也不会成为僵尸进程
- SA_NODEFER:使对信号的屏蔽无效,即在信号处理函数执行期间,仍能发出这个信号
- SA_RESETHAND:信号处理之后重新设置为默认的处理方式
- SA_SIGINFO:使用sa_sigaction作为默认的信号处理函数
二、sigaction使用示例
#include <stdio.h>
#include <unistd.h>
#include <signal.h>static void sig_usr(int signum)
{if(signum == SIGUSR1){printf("SIGUSR1 received \n");}else{printf("signal %d received\n",signum);}
}
int main(void)
{struct sigaction sa_usr;sa_usr.sa_flags = 0;sa_usr.sa_handler = sig_usr;//管理信号处理函数sigcation(SIGUSR1,&sa_usr,NULL);//注册信号处理方式printf("PID = %d\n",getpid());//打印当前进程pidwhile(1){//等待外部kill 当前进程}return 0;
}
保存文件,编译当前文件并执行:
# g++ testMysigcation.cpp -o run
# ./run PID = 42273
现在打开另一个终端,用kill发送命令:
# kill -USR1 42273SIGUSR1 received
可见sig_usr接收到了发送的信号,并正确打印了结果。sigaction注册信号处理函数时,不会自动重新发起被信号打断的系统调用。
------分享知识,让人愉悦,原创博文,支持请点赞。
Linux 使用sigaction查询或设置信号处理方式相关推荐
- 【Linux】Linux之DNS查询、设置及测试可用性
1.DNS查询的三种方式 1.1 cat /etc/resolv.conf 1.2 nslookup www.baidu.com 1.3 dig |grep www.baidu.com 2.DNS设置 ...
- [Linux学习]语系查询及设置
1. 显示当前的语系及文件编码 echo $LANG 2. 修改语系(例:设置为英文语系,UTF8编码) LANG=en_US.utf8 3. 查看系统支持的语系及编码 locale -a 4. 永久 ...
- 记录千兆网卡变百兆速率事件(linux)以及查询、恢复方式
事件: 某日跑着数据,突然发现千兆网卡变成了百兆速率(网卡低速),导致各种超时异常. 查询: 使用atop查看网卡的速率变成了 100Mbps !! 没有atop的可以使用ethtool +网卡 ...
- 我使用过的Linux命令之hwclock - 查询和设置硬件时钟
我使用过的Linux命令之hwclock - 查询和设置硬件时钟 本文链接:http://codingstandards.iteye.com/blog/804830 (转载请注明出处) 用途说明 ...
- linux系统运行hwclock报错,我使用过的Linux命令之hwclock - 查询和设置硬件时钟
用途说明 hwclock命令,与clock命令是同一个命令,主要用来查询和设置硬件时钟(query and set the hardware clock (RTC)).RTC=Real Time Cl ...
- linux启动设置运行级别,Linux的运行级别和设置开机启动服务的方式
Linux的运行级别 什么是运行级别呢?简单点来说,运行级别就是操作系统当前正在运行的功能级别.级别是从0到6,具有不同的功能.这些级别定义在/ect/inittab文件中.这个文件是init程序寻找 ...
- linux设置自启动方式
方式一:在/etc/rc.local文件中加入启动命令 这种方式适合linux用户手动配置自启动程序. 方式二:在/etc/rc[0-6].d/目录建立软链接,软链接指向/etc/init.d/目录下 ...
- 【代理设置】Linux Windows 系统下各工具设置代理方式笔记(整理中)
背景:公司局域网环境,只提供代理服务器&代理账号的方式上网.Linux服务器各种工具代理设置方法整理如下: 1. 命令行界面设置代理 命令行界面的一般代理设置方法:在profile文件中设置相 ...
- linux命令hwclock,Linux命令之hwclock - 查询和设置硬件时钟
常用参数 -r, --show 读取并打印硬件时钟(read hardware clock and print result ) -s, --hctosys 将硬件时钟同步到 ...
最新文章
- UWP Composition API - 锁定列的FlexGrid
- 图论(四)------非负权有向图的单源最短路径问题,Dijkstra算法
- LOJ#2127「HAOI2015」按位或
- Quartz 在 Spring 中如何动态配置时间
- 机器视觉:ransac算法详解
- mysql两张表一起计数_mysql-同一张表上的多个联接,其中一个查询计数
- 安卓Socket处理
- 使用Java读取 “Python写入redis” 的数据踩坑记录
- 【BZOJ4543】Hotel加强版【神仙树形dp】【长链剖分】
- Spring5.0(2)--- Framework 5 FAQ
- 自定义应用程序配置文件(app.config)
- 并行算法第一讲:概念及目标
- 电脑系统怎么重装win10的方法教程
- 用 TStringList 模拟 将字符串转换为变量的功能 - 回复 flq_00000 和 外来天客 的问题...
- 联想小新潮7000-13 型号:LENOVO 81BS 制作黑苹果,MACos 10.14.2+WIN 10 双系统
- 需求文档(PRD)撰写指南
- 近3年专著类计算机参考文献,参考文献著作类
- 传统直线检测算法与基于深度学习的直线检测算法
- 关于“程序员996”,互联网大神发话了,能顶用吗?
- 如何用数据说话-《数据化决策(美)道格拉斯·W.哈伯德》笔记与心得
热门文章
- IronPython资料
- c gui qt 4编程第二版_面试官问Linux下如何编译C程序,如何回答?为你编译演示
- asp.net Linux 界面,在 ASP.NET 中实现不同角色的用户使用不同登录界面的方法
- 怎么上传文件到kk服务器,VS Code 关于SFTP上传文件到多服务器的配置
- mysql正则通配符全解_mysql正则表达式与通配符
- rocketmq 如何保证高可用_RocketMq容灾、高可用方案
- RTP/RTCP/RTSP协议初探
- 利用SecureCRT在linux与Windows之间传输文件
- C/C++字节对齐问题
- Linux 串口编程三 使用termios与API进行串口程序开发