信号的基本概念及产生方式

信号的基本概念

    通俗一点说,信号一般做提醒工作,提醒之后会产生一系列的动作,比如红绿灯:过马路见到红灯亮了,提醒自己应该停止过马路,或者听到闹钟响了,或许很多人的动作是关掉闹钟后接着睡吧,但接着睡也是一种动作吧。

    在计算机中,信号是由操作系统发出的。首先先看一下计算机中的信号吧。

 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	

其中注意,没有32,33号信号。1-31是普通信号,34-64是实时信号。

信号的产生方式一般为:

1.用户在终端下按某些键时,终端驱动程序会发送信号给前台进程,如:Ctrl+c

2.硬件异常发出的信号,这些条件由硬件检测并通知内核,然后内核向当前进程发送适当信号。

3.一个进程调用kill(2)函数可以发送信号给另一个进程。

4.软件条件产生。

一般信号的处理方式:

1.忽略该信号。

2.默认处理信号。

3.用户自定义(捕捉信号)。


信号的产生:

一、通过终端按键产生信号

    SIGINT的默认处理动作是终止进程,SIGQUIT的默认处理动作是终止进程并且Core Dump

(核心转储)。

当一个进程要异常终止时,可以选择把进程的用户空间内存数据全部保存到磁盘上,文件名叫做core,叫做Core Dump。但默认是不允许产生core文件的,因为core文件中可能保存用户密码等信息,不安全。

二、调用系统函数向进程发信号

    kill命令是调用kill函数实现的。kill函数可以给一个进程发送指定的信号。。raise函数可以给当前的进程发送指定的信号(自己给自己发送信号)。

#include<signal.h>
int kill(pid_t pid,,int signo);
int raise(int signo);
这两个函数都是成功返回0,失败返回-1.


abort函数使用当前进程接受到信号而异常终止。
#include<stdlib.h>
void abort(void);
和exit函数一样,abort函数总会成功,故没有返回值。

需要注意:9号信号不能被捕捉,6号信号是自己给自己发信号。

三、由软件条件产生

    SIGPIPE是一种由软件条件产生的信号,在管道中产生。下面介绍另外一个,alarm函数,

#include<unistd.h>
unsigned int alarm(unsigned int seconds);
调用alarm函数可以设定一个闹钟,告诉内核在seconds秒后给当前进程发送一个SIGALRM信号,
该信号的默认处理动作是终止当前进程。
最后,一定要记得,信号是由操作系统发出的。

猜你喜欢

转载自blog.csdn.net/duckyloser/article/details/79978223