Linux信号

简介

软中断信号(signal,又简称为信号)用来通知进程发生了异步事件。进程之间可以互相通过系统调用kill发送软中断信号。内核也可以因为内部事件而给进程发送信号,通知进程发生了某个事件。注意,信号只是用来通知某进程发生了什么事件,并不给该进程传递任何数据。

在进程表的表项中有一个软中断信号域,该域中每一位对应一个信号,当有信号发送给进程时,对应位置位。由此可以看出,进程对不同的信号可以同时保留,但对于同一个信号,进程并不知道在处理之前来过多少个。

特征

1、简单
2、不能携带大量信息
3、一定条件

软中断

信号是由内核产生,并由内核进行处理
信号与中断很像,当进程程序执行过程中,收到信号,进程马上处理信号,处理完信号后再继续执行剩下的代码

产生方式

1)按键产生,如 ctrl +c、ctrl+z,ctrl+\

  1. 系统调用产生,如kill函数,raise函数,abort函数

3)软件条件产生,如定时器alarm,调用函数,开始计时,时间到,发送信号

4)硬件异常产生,如:非法访问内存(段错误)、除0(浮点数例外)、内存对齐出错(总线错误)

5)命令产生,如kill命令

默认处理

1)Term :终止进程

2)Ign:忽略信号(默认即对该种信号忽略操作)

3)Core:终止进程,并生成Core文件,(查验进程死亡原因,用于gdb调试)

4)Stop :停止(暂停)进程

5)continue:继续运行进程

信号的2种状态

递达:递送并且到达进程。

未决:信号产生和递达之间的状态。主要由于阻塞(屏蔽)导致该状态

信号的四要素

信号名+信号编号+信号默认处理动作+信号对应的事件(事件发生时才会发生)

1-31为常规信号
34-64 为实时信号

[root@server1 ~]# kill -l
 1) SIGHUP	 2) SIGINT	 3) SIGQUIT	 4) SIGILL	 5) SIGTRAP
 6) SIGABRT	 7) SIGBUS	 8) SIGFPE	 9) SIGKILL	10) SIGUSR1
11) SIGSEGV	12) SIGUSR2	13) SIGPIPE	14) SIGALRM	15) SIGTERM
16) SIGSTKFLT	17) SIGCHLD	18) SIGCONT	19) SIGSTOP	20) SIGTSTP
21) SIGTTIN	22) SIGTTOU	23) SIGURG	24) SIGXCPU	25) SIGXFSZ
26) SIGVTALRM	27) SIGPROF	28) SIGWINCH	29) SIGIO	30) SIGPWR
31) SIGSYS	34) SIGRTMIN	35) SIGRTMIN+1	36) SIGRTMIN+2	37) SIGRTMIN+3
38) SIGRTMIN+4	39) SIGRTMIN+5	40) SIGRTMIN+6	41) SIGRTMIN+7	42) SIGRTMIN+8
43) SIGRTMIN+9	44) SIGRTMIN+10	45) SIGRTMIN+11	46) SIGRTMIN+12	47) SIGRTMIN+13
48) SIGRTMIN+14	49) SIGRTMIN+15	50) SIGRTMAX-14	51) SIGRTMAX-13	52) SIGRTMAX-12
53) SIGRTMAX-11	54) SIGRTMAX-10	55) SIGRTMAX-9	56) SIGRTMAX-8	57) SIGRTMAX-7
58) SIGRTMAX-6	59) SIGRTMAX-5	60) SIGRTMAX-4	61) SIGRTMAX-3	62) SIGRTMAX-2
63) SIGRTMAX-1	64) SIGRTMAX	

接收到信号的处理

第一种是类似中断的处理程序,对于需要处理的信号,进程可以指定处理函数,由该函数来处理。

两种信号不能被忽略(分别是SIGKILL和SIGSTOP)

第二种方法是,忽略某个信号,对该信号不做任何处理,就象未发生过一样。
第三种方法是,对该信号的处理保留系统的默认值,这种缺省操作,对大部分的信 号的缺省操作是使得进程终止。进程通过系统调用signal来指定进程对某个信号的处理行为。

类型

(1) 与进程终止相关的信号。当进程退出,或者子进程终止时,发出这类信号。
(2) 与进程例外事件相关的信号。如进程越界,或企图写一个只读的内存区域(如程序正文区),或执行一个特权指令及其他各种硬件错误。
(3) 与在系统调用期间遇到不可恢复条件相关的信号。如执行系统调用exec时,原有资源已经释放,而目前系统资源又已经耗尽。
(4) 与执行系统调用时遇到非预测错误条件相关的信号。如执行一个并不存在的系统调用。
(5) 在用户态下的进程发出的信号。如进程调用系统调用kill向其他进程发送信号。
(6) 与终端交互相关的信号。如用户关闭一个终端,或按下break键等情况。
(7) 跟踪进程执行的信号。

具体信号和作用

信号量作用
SIGHUP用户退出shell时,由该shell的启动的所有进程将收到这个信号,默认动作为终止进程
SIGINT用户按下了<ctrl+c>组合键时,用户终端向正在运行中的由该终端启动的程序发出此信号。默认动作为终止进程
SIGQUIT<ctrl+>组合键时产生该信号,用户终端向正在运行中的由该终端启动的程序发出信号。默认动作为终止进程
SIGILLCPU检测到某进程执行了非法指令。默认动作为终止进程并产生core文件
SIGTRAP由断点或者其他trap指令产生。默认动作为终止进程并产生core文件
SIGABRT调用abort函数产生该信号。默认动作为终止进程并产生core文件
SIGBUS非法访问内存地址,包括内存对齐出错,默认动作为终止进程并产生core文件
SIGKILL无条件终止进程。本信号不能被忽略,阻塞和处理。默认动作为终止进程。向系统管理员提供可以杀死任何进程的方法
SIGUSE1用户定义的信号。程序员可以在程序中定义并使用该信号。默认动作为终止进程。
SIGSEGV指示进程进行了无效内存访问。默认动作为终止进程并产生core文件
SIGUSR2另一个用户自定义信号,程序员可以在程序中定义并使用该信号。默认动作为终止进程
SIGPIPEbroken pipe向一个没有读端的管道写数据。默认动作为终止进程。
SIGALRM定时器超时,超时的时间由系统调用alarm设置,默认动作为终止进程
SIGTERM程序结束信号。可以被阻塞和终止(与sigkill不同)通常表示程序正常退出。执行shell的命令kill时,缺省产生这个信号。默认动作为终止进程
SIGSTKFLTlinux早期版本出现的信号,现仍保留向后兼容。默认动作为终止进程
SIGCHLD子进程结束时,父进程会收到这个信号。默认动作为忽略这个信号
SIGCONT如果进程已停止,则使其继续运行。默认动作为继续/忽略
SIGSTOP停止进程的执行。信号不能被忽略,处理和阻塞。默认动作为暂停进程
SIGTSTP终止终端交互进程的运行。按下<ctrl+z>组合键时发出这个信号。默认动作为暂停进程
SIGTTIN后台进程读终端控制台。默认动作为暂停进程
SIGTTOU类似于SIGTTIN,在后台进程要向终端输出数据时发生。默认动作为暂停进程
SIGURG套接字上有紧急数据时,向当前正在运行的进程发出这些信号,报告有紧急数据到达。如网络带外数据到达,默认动作为忽略该信号
SIGXCPU进程执行时间超过了分配给该进程的CPU时间,系统产生该信号并发送给该进程。默认动作为终止进程
SIGXFSZ超过文件的最大长度设置。默认动作为终止进程
SIGVTALRM虚拟时钟超时产生。类似于SIGALRM,但是该信号只计算该进程占用CPU的使用时间。默认动作为终止进程
SGIPROF类似于SIGVTALRM,它不光包括该进程占用CPU时间,还包括执行系统调用时间。默认动作为终止进程
SIGWINCH窗口变化大小时发出。默认动作为忽略该信号
SIGIO此信号向进程指示发出了一个异步I/O事件。默认动作为忽略
SIGPWR关机;默认动作为终止进程
SIGSYS无效的系统调用。默认动作为终止进程并产生core文件
SIGRTMIN ~ SIGRTMAX LINUX的实时信号,它们没有固定的含义(可以由用户自定义)。所有的实时信号的默认动作都为终止进程

信号函数

信号定义在signal.h头文件中,信号名都定义为正整数

signal原型:

typedef	void(*sighandler_t)(int)---------函数指针
sighandler_t signal(int signum,sighandler_t handler);

int signum:信号编码
sighandler_t(结构体) handler:函数指针

int kill(pid_t pid,int sig);

pid:进程ID号
sig:信号编号

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值