139 Linux 系统编程16 ,信号,kill,alarm,time,setitimer,阻塞/未决信号集,信号4要素,信号的产生,屏蔽信号,捕捉信号,内核捕捉信号过程,父进程捕捉子进程结束信号

1.信号的机制

A给B发送信号,B收到信号之前执行自己的代码,收到信号后,不管执行到程序的什么位置,都要暂停运行,去处理信号,处理完毕再继续执行。与硬件中断类似——异步模式。但信号是软件层面上实现的中断,早期常被称为“软中断”。

信号的特质:由于信号是通过软件方法实现,其实现手段导致信号有很强的延时性。但对于用户来说,这个延迟时间非常短,不易察觉。

每个进程收到的所有信号,都是由内核负责发送的,内核处理。

2.信号的产生

产生信号:

1. 按键产生,如:Ctrl+c、Ctrl+z、Ctrl+\

2. 系统调用产生,如:kill、raise、abort

3. 软件条件产生,如:定时器alarm

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

5. 命令产生,如:kill命令

3.信号的状态

产生:

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

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

处理:

4.信号的处理方式: 

1.每一种信号都有自己的 默认处理  行为

                默认处理 有如下5种,每一种信号的默认动作都不一样

                Term:终止进程

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

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

                Stop:停止(暂停)进程

                Cont:继续运行进程

除了默认的处理行为,我们还可以自行设定处理方式,一般自行设定的处理方式有如下的两种,一种是忽略; 一种是捕捉后,调用自己写的函数或者系统函数

2. 忽略(丢弃) 

3. 捕捉(调用户处理函数)

5.信号产生在哪里存放-PCB 中的阻塞信号集,以及未决信号集

Linux内核的进程控制块PCB是一个结构体,task_struct, 除了包含进程id,状态,工作目录,用户id,组id,文件描述符表,还包含了信号相关的信息,主要指阻塞信号集和未决信号集

阻塞信号集和未决信号集的本质都是位图

在正常的情况下,当我们使用代码或者命令或者硬件错误等方法 驱动内核发出去了一个信号的时候,未决信号集中对应的信号就会被设置为1,处理后,又会变成0.

一般情况下,信号由内核 发出后,很快就能达到进程PCB中,在宏观上层面上,我们直接理解为信号一发送,进程就能收到。信号立即递达。递达后就可以处理了。

但是我们可以通过设置 阻塞信号集,让这个信号不能递达,假设我们将2号信号 加入到 阻塞信号集,如图

我们可以人为的将信号屏蔽字,
也就是 阻塞信号集 中的2号设置为1,
代表着2号信号会被屏蔽,
代表着2号信号一直无法递达,
将处于未决状态,


只有当我们解除了屏蔽后,
2信号才能到达,也就是说,
只有在信号屏蔽字中将 2 号新号改为0时候,
2号信号才能递达,才有机会从1变成0(被处理)

 阻塞信号集(信号屏蔽字)

可以将某些信号加入阻塞信号集后,会对他们设置屏蔽,意思是:当该信号加入到阻塞信号集后,即使收到该信号,该信号的处理会被推迟,推迟到什么时候呢?直到该信号 被 解除屏蔽

未决信号集:

信号产生后,未决信号集中描述该信号的位立刻翻转为1,表示信号处于未决状态。

当信号被处理对应位翻转回为0。这一时刻往往非常短暂。

但是如果信号产生后,由于某些原因不能达到,主要是阻塞原因,那么这个信号就一直处理未决状态,我们将这类信号的集合称之为未决信号集。在屏蔽解除前,信号一直处于未决状态。    

6.信号的编号

可以使用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

不存在编号为0的信号。其中1-31号信号称之为常规信号(也叫普通信号或标准信号),34-64称之为实时信号,驱动编程与硬件相关。名字上区别不大。而前32个名字各不相同。

7.信号4要素

与变量三要素类似的,每个信号也有其必备4要素,分别是:

1. 编号 2. 名称 3. 事件 4. 默认处理动作

可通过man 7 signal查看帮助文档获取。也可查看/usr/src/linux-headers-3.16.0-30/arch/s390/include/uapi/asm/signal.h

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

SIGFPE        8       Core    Floating point exception

SIGKILL        9       Term    Kill signal

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值