1. 信号理论基础
**信号共性:
简单、不能携带大量信息、满足条件才发送
**信号的特质:
信号是软件层面上的"中断"。一旦型号产生,无论程序执行到什么位置,必须立即停止运行,处理信号,处理结束,在继续执行后续指令。
所有信号的产生以及处理全部都是有【内存】完成的
*** 信号产生
1. 按键产生,ctrl+z、ctrl+c
2. 系统调用产生, 如果kill
3. 软件条件产生, sleep
4. 硬件异常产生, 段错误、
段错误: 1. 访问了不是自己内存, 比如malloc自己申请了区域,访问malloc区域外了
2. 对只读区进行修改 char* ch="abc" ch[0]='a'
5.命令产生,比如kill命令
未决: 产生与递达之间状态
递达: 产生送到内核,直接被内核处理掉
信号处理方式: 默认、忽略、捕捉(自定义)
linux内核进程控制块pcb是一个结构体,task_struct,除了包含进程id,状态,工作目录,用户id,组id,文件描述符表,
还包含信号相关信息,阻塞信号和未决信号
例子:
比如ctrl+c发送2号信号,那么未决信号集把第二位设置为1,那么内核发现第二未变成1了,处理2号信号,处理[默认、忽略、捕捉(自定义)]完毕第二位变成0
未决信号集把第二位设置为1
完毕第二位变成0
如果由于某种原因,把2号信号设置屏蔽,那么信号屏蔽字中2号变成1,那么信号不能递到内核,那么信号不能处理
等到屏蔽字中2号变成0,那么信号才可以被处理,未决信号集才把第二位设置为0
信号阻塞
2. 常用信号集
信号4要素:
信号编号、名称、 对应事件、默认处理动作
man 7 signal
Signal Value Action Comment
──────────────────────────────────────────────────────────────────────
SIGHUP 1 Term Hangup detected on controlling terminal
or death of controlling process
SIGINT 2 Term Interrupt from keyboard
SIGQUIT 3 Core Quit from keyboard
SIGILL 4 Core Illegal Instruction
SIGABRT 6 Core Abort signal from abort(3)
SIGFPE 8 Core Floating point exception
SIGKILL 9 Term Kill signal
SIGSEGV 11 Core Invalid memory reference
SIGPIPE 13 Term Broken pipe: write to pipe with no
readers
SIGALRM 14 Term Timer signal from alarm(2)
SIGTERM 15 Term Termination signal
SIGUSR1 30,10,16 Term User-defined signal 1
SIGUSR2 31,12,17 Term User-defined signal 2
SIGCHLD 20,17,18 Ign Child stopped or terminated
SIGCONT 19,18,25 Cont Continue if stopped
SIGSTOP 17,19,23 Stop Stop process
SIGTSTP 18,20,24 Stop Stop typed at terminal
SIGTTIN 21,21,26 Stop Terminal input for background process
SIGTTOU 22,22,27 Stop Terminal output for background processSIGUSR1 30,10,16 Term User-defined signal 1 不同操作系统对应value不一样,名称一样
1 SIGHUP: 当用户退出shell时,由该shell启动所有进程将接收这个信号,默认动作为停止进程
2 SIGINT: 相当于ctrl+c(终止/中断), 默认是终止进程
3 SIGQUIT: 相当于ctrl+\(退出), 默认是终止进程
6 SIGBUS: 总线错误,非法访问内存地址,默认终止进程产生core文件[用于gdb调试能够找到错误所在行,那么因为程序在终止的时候把错误信息写入了core文件]
8 SIGFPE: 发生致命运算错误时发生, 包括溢出,除数为0,默认终止进程产生core文件
10 SIGUSR1: 用户定义信号, 程序员可以在程序中定义并且使用该信号, 默认动作是终止进程
12 SIGUSR2: 用户定义信号, 程序员可以在程序中定义并且使用该信号, 默认动作是终止进程
*****
9 SIGKILL: 无条件终止进程, 不能被忽略、阻塞,上面的ctrl+c信号,如果把该信号捕捉掉,那么进程无法杀死,如果是病毒,完了
19 SIGSTOP:无条件停止
11 SIGSEGV: 进程在进程无效内存访问,默认终止进程产生core文件
13 SIGPIPE: 向一个没有读端的管道写数据,默认终止进程
14 SIGALRM: 定时器超时,超时时间 有系统调用alarm 设置,默认动作终止进程
17 SIGCHLD: 子进程终止时候、子进程接收到SIGSTOP信号停止时、子进程处停止态,接收到SIGCONT后唤醒时,告诉父进程,父进程可以去收尸了,默认忽略
20 SIGTSTP: ctrl+z. (暂停/停止)