一 信号处理
<signal.h>
头文件<signal.h>中提供了一些用于处理程序运行期间所引发的异常条件的功能,如处理来源于外部的中断信号或程序执行期间出现的错误等事件。
9.1 signal
#include <signal.h> void (*signal(int sig, void (*handler)(int)))(int);
signal()用于确定以后当信号sig出现时的处理方法。如果handler的值是SIG_DFL,那么就采用实现定义的缺省行为;如果handler的值是SIG_IGN,那么就忽略该信号;否则,调用handler所指向的函数(参数为信号类型)。有效的信号包括:
SIGABRT | 异常终止,如调用abort()。 |
SIGFPE | 算术运算出错,如除数为0或溢出。 |
SIGILL | 非法函数映象,如非法指令。 |
SIGINT | 交互式信号,如中断。 |
SIGSEGV | 非法访问存储器,如访问不存在的内存单元。 |
SIGTERM | 发送给本程序的终止请求信号。 |
signal()返回信号sig原来的的handler;如果出错,则返回SIG_ERR。
当随后出现信号sig时,就中断正在执行的操作,转而执行信号处理函数(*handler)(sig)。如果从信号处理程序中返回,则从中断的位置继续执行。
信号的初始状态由实现定义。
9.2 raise
#include <signal.h> int raise(int sig);
向程序发送信号sig。如果发送不成功,就返回一个非0值。
转载自》http://www.swordair.com/docs/c-language-standard-library/chapter-9/2 信号集
sigset_t
百度百科
3 sigaction
sigaction函数的功能是检查或修改与指定信号相关联的处理动作(可同时两种操作)。
他是POSIX的信号接口,而signal()是标准C的信号接口(如果程序必须在非POSIX系统上运行,那么就应该使用这个接口)
给信号signum设置新的信号处理函数act, 同时保留该信号原有的信号处理函数oldact
int sigaction(int signo,const struct sigaction *restrict act, struct sigaction *restrict oact); |
结构sigaction定义如下:
struct sigaction{ |
sa_handler字段包含一个信号捕捉函数的地址
sa_mask字段说明了一个信号集,在调用该信号捕捉函数之前,这一信号集要加进进程的信号屏蔽字中。仅当从信号捕捉函数返回时再将进程的信号屏蔽字复位为原先值。
sa_flag是一个选项,主要理解两个
SA_INTERRUPT 由此信号中断的系统调用不会自动重启 SA_SIGINFO 提供附加信息,一个指向siginfo结构的指针以及一个指向进程上下文标识符的指针 |
最后一个参数是一个替代的信号处理程序,当设置SA_SIGINFO时才会用他。
参考: http://blog.chinaunix.net/uid-1877180-id-3011232.html
4 信号屏蔽字
一个进程的信号屏蔽字规定了当前阻塞而不能递送给该进程的信号集。
(1)
头文件
函数原型
根据how的方式对set和oldset进行组合,确定最后最终的信号集合。这个信号集合就是信号屏蔽字。
函数说明
SIG_BLOCK
|
该进程新的信号屏蔽字是其当前信号屏蔽字和set指向信号集的并集。set包含了我
们希望阻塞的附加信号。
|
SIG_UNBLOCK
|
该进程新的信号屏蔽字是其当前信号屏蔽字和set所指向信号集的补集的交集。set包含了
我们希望解除阻塞的信号.
|
SIG_SETMASK
|
该进程新的信号屏蔽是set指向的值
|
- pthread_sigmask 用来定义线程的信号掩码
- 其接口与 sigprocmask 一样-----------------这是相对sigprocmask的区别。
- 用在多线程环境中
概念
- 按照 POSIX, 异步 (外部) 信号发送到整个进程.
- 所有线程共享同一个设置, 即通过 sigaction 设置的线程处置方法.
- 每个线程有自己的信号掩码, 线程库根据该掩码决定将信号发送到哪个线程.
- 由于 Linux 线程实现上的独特性, 外部信号始终发送到特定的线程.