每一个信号都有一个信号处理函数,可以是SIG_IGN, SIG_DFL或者是用户自定义的处理函数。使用用户自定义的处理函数需要注册,注册接口有如下两种。

第一种是signal调用

#include <signal.h>/***  sighandler_t是GNU的扩展,如果在glibc下面使用的话,编译的时候需要加上-D_GNU_SOURCE*  或者手动定义*/
typedef void (*sighandler_t)(int);/***  为信号signum注册信号处理函数handler*  成功返回该信号之前的处理函数,失败返回SIG_ERR并将失败原因填写到errno中*/
sighandler_t signal(int signum, sighandler_t handler);

使用signal调用会有兼容性问题,尤其是移植到其它UNIX系统上,所以推荐使用第二种信号注册函数sigaction,该函数功能相对signal而言,能够提供更多功能。

#include <signal.h>
/***  注册信号处理函数,成功返回0,失败返回-1并置errno*  参数act存储待注册的信号处理函数结构体*  如果oldact非空的话,旧的信号处理函数会存储到该结构体中*/
int sigaction(int signum, const struct sigaction *act,struct sigaction *oldact);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中使用
1. sa_handler是一个参数为信号值的处理函数
2. sa_sigaction也是一个信号处理函数,不过它有三个参数,能够获取到处信号值以外更多信息,当sa_flags中包含SA_SIGINFO标志位的时候需要用到该函数。
3. sa_mask是信号处理函数执行期间的屏蔽信号集。就是说在信号处理函数执行期间,屏蔽某些信号。但是不是所有信号都能够被屏蔽,SIGKILL和SIGSTOP这两个信号就无法屏蔽,因为操作系统自身要能够控制住进程。
4. sa_flags可以是下面这些值的集合:1. SA_NOCLDSTOP,这个标志位只用于SIGCHLD信号。父进程可以检测子进程三个事件,子进程终止、子进程停止、子进程回复。SA_NOCLDSTOP标志位用于控制后两个事件。即一旦父进程为SIGCHLD信号设置了这个标志位,那么子进程停止和子进程恢复这两件事情,就无需向父进程发送SIGCHLD信号2. SA_NOCLDWAIT这个标志只用于SIGCHLD信号,它可控制子进程终止时候的行为,如果父进程为SIGCHLD设置了SA_NOCLDWAIT标志位,那么子进程终止退出时,就不会进入僵尸状态,而是直接自行了断。但是对Linux而言,子进程仍然会发送SIGCHLD信号,这点和上面的SA_NOCLDSTOP略有不同。3. SA_ONESHOT和SA_RESETHAND这两个标志位本质是一样的,表示信号处理函数是一次性的,信号递送出去以后,信号处理函数便恢复成默认值SIG_DFL.4. SA_NODEFER和SA_NOMASK这两个标志位的作用是一样的,信号处理函数执行期间,不阻塞当前信号。5. SA_RESTART这个标志位表示,如果系统调用被信号中断,则不返回错误,而是自动重启系统调用。6. SA_SIGINFO这个标志位表示信号发送者会提供额外的信息。这种情况下,信号处理函数应该为三参数的函数。
 当sa_flags含有SA_SIGINFO的时候 ,需要使用带三个参数的处理函数:
void
handler(int sig, siginfo_t *info, void *ucontext)
{...
}第一个参数 sig 为信号值
第三个参数 ucontext,该结构体提供了进程上下文信息,通常都不会使用到该参数,具体细节
可参考man     sigreturn第二个参数 info 是一个siginfo_t类型的指针,包含了信号更多的信息。该结构体如下:siginfo_t {int      si_signo;     /* 信号值 */int      si_errno;     /* An errno value */int      si_code;      /* 信号来源,可以通过该值来判断信号来源* 可选值及含义* SI_USER : 调用kill 或 raise的用户进程* SI_TKILL :调用tkill或tgkill的用户进程* SI_QUEUE : 调用sigqueue的用户进程* SI_MESGQ : 消息到达POSIX消息队列* SI_KERNEL : 内核产生的信号* SI_ASYNCIO : 异步I/O操作完成* SI_TIMER: POSIX定时器到期*/int      si_trapno;    /* Trap number that causedhardware-generated signal(unused on most architectures) */pid_t    si_pid;       /* 信号发送进程ID */uid_t    si_uid;       /* 信号发送进程这是用户ID */int      si_status;    /* Exit value or signal */clock_t  si_utime;     /* User time consumed */clock_t  si_stime;     /* System time consumed */sigval_t si_value;     /* 使用sigqueue函数发送信号时携带的伴随数据 */int      si_int;       /* POSIX.1b signal */void    *si_ptr;       /* POSIX.1b signal */int      si_overrun;   /* Timer overrun count;POSIX.1b timers */int      si_timerid;   /* Timer ID; POSIX.1b timers */void    *si_addr;      /* Memory location which caused fault */long     si_band;      /* Band event (was int inglibc 2.3.2 and earlier) */int      si_fd;        /* File descriptor */short    si_addr_lsb;  /* Least significant bit of address(since Linux 2.6.32) */void    *si_lower;     /* Lower bound when address violationoccurred (since Linux 3.19) */void    *si_upper;     /* Upper bound when address violationoccurred (since Linux 3.19) */int      si_pkey;      /* Protection key on PTE that causedfault (since Linux 4.6) */void    *si_call_addr; /* Address of system call instruction(since Linux 3.5) */int      si_syscall;   /* Number of attempted system call(since Linux 3.5) */unsigned int si_arch;  /* Architecture of attempted system call(since Linux 3.5) */
}
上面的sigval_t结构体定义如下:
union sigval {int sival_int;void *sival_ptr;
}
通过指定sigqueue函数的第三个参数,可以传递给一个int值或者指针值个目标进程。考虑
到不同的进程有各自独立的地址空间,传递指针到另一个进程几乎没有意义。

参考资料:

1. 《Linux 环境编程,从应用到内核》高峰,李彬著

2.   man signal : https://linux.die.net/man/2/signal

man sigaction : http://www.man7.org/linux/man-pages/man2/sigaction.2.html

Linux信号 二 信号处理函数注册相关推荐

  1. Linux操作系统下信号处理函数

    Linux系统下的信号 一.信号概念 1. 什么是信号 信号是软件中断,信号提供了一种异步处理事件的方法,它允许进程和内核中断其他进程.一个信号就是一条消息,它通知进程系统发生了一个某种类型的事件,在 ...

  2. linux 系统对信号的处理,Linux下的信号处理函数总结

    1.信号处理函数 相关函数原型如下: #include sighandler_t signal(int signum, sighandler_t handler); 第一参数是信号 第二个参数是信号处 ...

  3. Linux信号之signal函数

    1. 信号概述 何为信号:信号就是由用户.系统或进程发送给目标进程的信息,以通知目标进程中某个状态的改变或是异常. 信号产生:总体来说,其产生的条件有两种,分别是:硬件和软件原因,又称为:硬中断和软中 ...

  4. Linux 信号signal处理函数--转

    alarm(设置信号传送闹钟) 相关函数 signal,sleep 表头文件 #include<unistd.h> 定义函数 unsigned int alarm(unsigned int ...

  5. Linux 信号signal处理函数

    alarm(设置信号传送闹钟) 相关函数 signal,sleep 表头文件 #include<unistd.h> 定义函数 unsigned int alarm(unsigned int ...

  6. linux 向程序发送信号,Linux下的信号处理

    Linux下的信号处理 发布时间:2006-01-02 09:34:14来源:红联作者:reing 前言:这一章我们讨论一下Linux下的信号处理函数. Linux下的信号处理函数: 信号的产生 信号 ...

  7. linux信号(一)--unix环境高级编程读书笔记

    1.信号的概念 在这里要给出一个信号的准确概念感觉很困难,可以这么说,信号就是进程之间或者内核与进程间异步通信的一种机制,有点类似于中断的性质.在  linux  系统中有  31  种信号,每一种信 ...

  8. linux中的信号处理与SROP

    版权声明:本文为CSDN博主「ashimida@」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明. 原文链接:https://blog.csdn.net/lidan1 ...

  9. linux编程下signal()函数

    首先说明函数指针的定义形式:      <存储类型> 数据类型 (* 函数指针名) (参数表):     其中存储类型一般不写,用默认形式.可以选auto型.static型和extern型 ...

最新文章

  1. ABAP OO的八大理由(四)
  2. jdbc版本怎么看_Jmeter(十三)-JDBC脚本开发
  3. Tensorflow笔记(一)
  4. PermissionError: [Errno 13] Permission denied:
  5. 利用python对excel文件进行操作_数据处理-对Excel文件读取和操作和存储(python版)...
  6. 方法同时使用微服务调用文件上传方法以及调用另一微服务的方法时报错failed to parse multipart servlet Request
  7. ArcGIS和Fragstats的脚本化调用 ------以ArcPy和命令行的方式
  8. 摄影毁一生单反穷三代顺口溜_哪款便宜的单反相机好
  9. 百度网盘机器人好友群组消息虚拟商品自动发货回复软件机器人助手
  10. Unity-使用UPR资源检测工具AssetChecker-Win进行本地资源检测
  11. LearnOpenGL->立方体贴图
  12. 榜样访谈——曾钰倬:从讲座中收获经验
  13. python太极代码_Python : Turtle绘图-太极图(代码)
  14. 从零开始的颜值评分 游戏项目 (一)Maven的相关配置 ——第一个SpringBoot小程序
  15. python12306下单步骤_python编程实现12306的一个小爬虫实例
  16. 如何在自己电脑上配置开发深度学习项目(windows)
  17. 一些经常送福利的技术公众号
  18. Linux命令uname -a和uname -r的详解 2022_11_30
  19. ps—人物夸张的漫画
  20. 凯乐科技量子计算机,量子计算机仍是梦想,但量子通信的时代已经到来 原理 昨天 量子计算机仍然是一个梦...

热门文章

  1. 松开手,你可以拥有更多
  2. LCAOSCF自洽场氟化氢HF斯莱特函数
  3. learnpython有中文版吗_简介 | Learn Python the Hard Way 中文版
  4. 1.4 Padding-深度学习第四课《卷积神经网络》-Stanford吴恩达教授
  5. Ardino基础教程 21_最简单最快控制LCD1602
  6. verilog基础-状态机之FPGA独立按键消抖设计与验证(熟练testbench的写法)
  7. 不讲嫖德?这些年接触/使用的网页剪辑工具小汇总大总结
  8. 【LDPC/STBC】基于LDPC/STBC编译码的图像传输系统的MATLAB仿真
  9. 标准PSO辨识NARMAX模型源码程序
  10. 十八、中断之独立按键