一、概述

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查询或设置信号处理方式相关推荐

  1. 【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设置 ...

  2. [Linux学习]语系查询及设置

    1. 显示当前的语系及文件编码 echo $LANG 2. 修改语系(例:设置为英文语系,UTF8编码) LANG=en_US.utf8 3. 查看系统支持的语系及编码 locale -a 4. 永久 ...

  3. 记录千兆网卡变百兆速率事件(linux)以及查询、恢复方式

    事件: 某日跑着数据,突然发现千兆网卡变成了百兆速率(网卡低速),导致各种超时异常. 查询:   使用atop查看网卡的速率变成了 100Mbps !! 没有atop的可以使用ethtool  +网卡 ...

  4. 我使用过的Linux命令之hwclock - 查询和设置硬件时钟

    我使用过的Linux命令之hwclock - 查询和设置硬件时钟 本文链接:http://codingstandards.iteye.com/blog/804830   (转载请注明出处) 用途说明 ...

  5. linux系统运行hwclock报错,我使用过的Linux命令之hwclock - 查询和设置硬件时钟

    用途说明 hwclock命令,与clock命令是同一个命令,主要用来查询和设置硬件时钟(query and set the hardware clock (RTC)).RTC=Real Time Cl ...

  6. linux启动设置运行级别,Linux的运行级别和设置开机启动服务的方式

    Linux的运行级别 什么是运行级别呢?简单点来说,运行级别就是操作系统当前正在运行的功能级别.级别是从0到6,具有不同的功能.这些级别定义在/ect/inittab文件中.这个文件是init程序寻找 ...

  7. linux设置自启动方式

    方式一:在/etc/rc.local文件中加入启动命令 这种方式适合linux用户手动配置自启动程序. 方式二:在/etc/rc[0-6].d/目录建立软链接,软链接指向/etc/init.d/目录下 ...

  8. 【代理设置】Linux Windows 系统下各工具设置代理方式笔记(整理中)

    背景:公司局域网环境,只提供代理服务器&代理账号的方式上网.Linux服务器各种工具代理设置方法整理如下: 1. 命令行界面设置代理 命令行界面的一般代理设置方法:在profile文件中设置相 ...

  9. linux命令hwclock,Linux命令之hwclock - 查询和设置硬件时钟

    常用参数 -r, --show         读取并打印硬件时钟(read hardware clock and print result ) -s, --hctosys      将硬件时钟同步到 ...

最新文章

  1. UWP Composition API - 锁定列的FlexGrid
  2. 图论(四)------非负权有向图的单源最短路径问题,Dijkstra算法
  3. LOJ#2127「HAOI2015」按位或
  4. Quartz 在 Spring 中如何动态配置时间
  5. 机器视觉:ransac算法详解
  6. mysql两张表一起计数_mysql-同一张表上的多个联接,其中一个查询计数
  7. 安卓Socket处理
  8. 使用Java读取 “Python写入redis” 的数据踩坑记录
  9. 【BZOJ4543】Hotel加强版【神仙树形dp】【长链剖分】
  10. Spring5.0(2)--- Framework 5 FAQ
  11. 自定义应用程序配置文件(app.config)
  12. 并行算法第一讲:概念及目标
  13. 电脑系统怎么重装win10的方法教程
  14. 用 TStringList 模拟 将字符串转换为变量的功能 - 回复 flq_00000 和 外来天客 的问题...
  15. 联想小新潮7000-13 型号:LENOVO 81BS 制作黑苹果,MACos 10.14.2+WIN 10 双系统
  16. 需求文档(PRD)撰写指南
  17. 近3年专著类计算机参考文献,参考文献著作类
  18. 传统直线检测算法与基于深度学习的直线检测算法
  19. 关于“程序员996”,互联网大神发话了,能顶用吗?
  20. 如何用数据说话-《数据化决策(美)道格拉斯·W.哈伯德》笔记与心得

热门文章

  1. IronPython资料
  2. c gui qt 4编程第二版_面试官问Linux下如何编译C程序,如何回答?为你编译演示
  3. asp.net Linux 界面,在 ASP.NET 中实现不同角色的用户使用不同登录界面的方法
  4. 怎么上传文件到kk服务器,VS Code 关于SFTP上传文件到多服务器的配置
  5. mysql正则通配符全解_mysql正则表达式与通配符
  6. rocketmq 如何保证高可用_RocketMq容灾、高可用方案
  7. RTP/RTCP/RTSP协议初探
  8. 利用SecureCRT在linux与Windows之间传输文件
  9. C/C++字节对齐问题
  10. Linux 串口编程三 使用termios与API进行串口程序开发