信号的产生
信号的产生方式
-
键盘产生
- 键盘产生的信号只能发送给前台进程。例如:[Ctrl+C]…
-
程序异常
- 除0错误。除0错误会导致硬件错误。
- core dumped(核心转储):当进程异常退出时,操作系统会将该进程发生异常退出之前在内存中的数据存储至硬盘上。
- 但是通常发生程序异常退出时,用户并不会发现程序产生了一个core dumped文件,这是因为操作系统当前给用户可产生core file size大小为0,因为core文件的大小不是很小的,所以一般系统会将可产生core文件的大小为0,即通常不产生core文件。
- ulimit -a:查看系统当前分配给用户设置资源方面的限制条件。
- core文件前面是core,后面是引起产生该core文件的进程pid。
- 使用core文件调试代码:在Linux环境下,进入使用gdb调试代码,在gdb内部,使用core-file [core文件名],就会直接定位到引发core文件产生的对应行。
- 2、9号信号不会产生core文件。
-
使用kill命令
-
通过系统调用接口给特定进程发送信号
-
#include<signal.h> int kill(pid_t pid, int signo); //向特定进程发送特定信号;成功返回0;失败返回-1
-
#include<signal.h> int raise(int signo); //向当前进程发送特定信号;成功返回0;失败返回-1
-
#include<stdlib.h> void abort(void); //使当前进程收到信号而异常终止;就像exit()函数一样,abort()函数总是会成功的,所以没有返回值
-
-
由软件条件发送信号
-
SIGPIPE:SIGPIPE是一种由软件条件产生的信号,当一个管道的读端被关闭时,这时候操作系统就会检测到该管道中写入的数据不会在有人来管道内读文件了,操作系统会认为该管道的存在会造成内存资源的极大浪费,则操作系统就会向写端对应的目标进程发送SIGPIPE信号。
-
#include<unistd.h> unsigned int alarm(unsigned int seconds); //调用alarm函数可以对当前进程设置一个闹钟,也就是告诉操作系统在seconds秒之后对当前进程发送SIGALRM信号,该信号的默认处理动作是终止当前进程。
- 返回值:该函数的返回值是0或者是以前设定的闹钟时间还剩余的秒数。如果second的值为0,则表示取消以前设定的闹钟。
-
信号的在内核中的表示
进程的PCB包含了进程的一切信息,所以它理所应当的要保存进程的信号信息。操作系统使用了两张位图&一张函数指针数组表来控制进程的信号。
- 实际执行信号的处理动作称为信号递达。
- 信号从产生到递达之间的状态,称为信号未决。
- 被阻塞的信号产生时将保存在未决状态,直到进程解除对该信号的阻塞,才能执行递达的动作。
- 阻塞和忽略不同,只要信号被阻塞就不会递达;而忽略是在递达之后,可选的一种处理动作。
pending(未决信号表)
- pending表用来表示进程收到的未决信号。当进程收到一个信号时,就会将该进程PCB中的pending表中对应的表示该信号的位图置为1。当信号被递达时,对应位置会被置为0。
- 常规信号在递达之前产生多次只记一次,而实时信号在递达之前产生多