德国 慰安:linux 信号(signal)推荐.

来源:百度文库 编辑:偶看新闻 时间:2024/05/02 11:44:57
信号是Linux编程中极其重要的局部,本文将翔实推荐信号机制的大约观念、Linux对信号机制的大约告终措施、如何利用信号,以及有关信号的几个体系调用。

信号机制是历程之间互相递交消息的一种措施,信号全称为软间断信号,也有人称作软间断。从它的命名能够看出,它的性质和利用很象间断。因而,信号能够说是历程扼制的一局部。

一、信号的大约观念

本节先推荐信号的一些大约观念,然后给出一些大约的信号种类和信号对应的事件。大约观念对于会意和利用信号,对于会意信号机制都尤其重要。下面就来看看什么是信号。

1、大约观念

软间断信号(signal,又简称为信号)用来通知历程发生了异步事件。历程之间能够互相穿越系统调用kill发送软间断信号。内核也能够因为内部事件而给历程发送信号,通知历程发生了某个事件。当心,信号只是用来通知某历程发生了什么事件,并不给该历程递交任何数据。

收到信号的历程对各种信号有不同的处理措施。处理措施能够分为三类:第一种是相仿间断的处理过程,对于必需处理的信号www.dj5g.com,历程能够指定处理函数,由该函数来处理。第二种措施是,疏忽某个信号,对该信号不做任何处理,就象未发生过一样。第三种措施是,对该信号的处理保留系统的默认值,这种缺省垄断,对大局部的信号的缺省垄断是使得历程终止。历程穿越系统调用signal来指定历程对某个信号的处理行动。

在历程表的表项中有一个软间断信号域,该域中每一位对应一个信号,当有信号发送给历程时,对应位置位。由此能够看出,历程对不同的信号能够同时保留,但对于统一个信号,历程并不懂得在处理之前来过多少个。

2、信号的种类

公布信号的起因许多,这里按公布信号的起因容易分类,以打听各种信号:

(1) 与历程终止相干的信号。当历程退出,可能子历程终止时,公布这类信号。
(2) 与历程除邦交件相干的信号。如历程越界,或空想写一个只读的内存区域(如过程正文区),或厉行一个特权号召及其他各种硬件讹谬。
(3) 与在系统调用其间遭到不可还原条件相干的信号。如厉行系统调用exec时,原有资源曾经释放,而现在系统资源又曾经耗竭。
(4) 与厉行系统调用时遭到非料想讹谬条件相干的信号。如厉行一个并不存在的系统调用。
(5) 在用户态下的历程公布的信号。如历程调用系统调用kill向其他历程发送信号。
(6) 与终端交互相干的信号。如用户关闭一个终端,或按下break键等情形。
(7) 追寻历程厉行的信号。

Linux扶持的信号列表如下。许多信号是与机器的系统构造相干的,率先列出的是POSIX.1中列出的信号:

信号 值 处理动作 公布信号的起因
----------------------------------------------------------------------
SIGHUP 1 A 终端挂起可能扼制历程终止
SIGINT 2 A 键盘间断(如break键被按下)
SIGQU99v 3 C 键盘的退出键被按下
SIGILL 4 C 违法号召
SIGABRT 6 C 由abort(3)公布的退出号召
SIGFPE 8 C 浮点失常
SIGKILL 9 AEF Kill信号
SIGSEGV 11 C 无效的内存引用
SIGPIPE 13 A 管说破裂: 写一个未曾读端口的管道
SIGALRM 14 A 由alarm(2)公布的信号
SIGTERM 15 A 终止信号
SIGUSR1 30,10,16 A 用户自定义信号1
SIGUSR2 31,12,17 A 用户自定义信号2
SIGCHLD 20,17,18 B 子历程告终信号
SIGCONT 19,18,25 历程继续(曾被静止的历程)
SIGSTOP 17,19,23 DEF 终止历程
SIGTSTP 18,20,24 D 扼制终端(tty)上按下静止键
SIGTTIN 21,21,26 D 后台历程空想从扼制终端读
SIGTTOU 22,22,27 D 后台历程空想从扼制终端写

下面的信号没在POSIX.1中列出,而在SUSv2列出

信号 值 处理动作 公布信号的起因
--------------------------------------------------------------------
SIGBUS 10,7,10 C 总线讹谬(讹谬的内存拜会)
SIGPOLL A Sys V定义的Pollable事件,与SIGIO同义
SIGPROF 27,27,29 A Profiling定时器到
SIGSYS 12,-,12 C 无效的系统调用 (SVID)
SIGTRAP 5 C 追寻/断点捉拿
SIGURG 16,23,21 B Socket揭示紧迫条件(4.2 BSD)
SIGVTALRM 26,26,28 A 切实工夫报警时钟信号(4.2 BSD)
SIGXCPU 24,24,30 C 超过设定的CPU工夫局限(4.2 BSD)
SIGXFSZ 25,25,31 C 超过设定的文件大小局限(4.2 BSD)

(对于SIGSYS,SIGXCPU,SIGXFSZ,以及某些机器系统构造下的SIGBUS,Linux缺省的动作是A (terminate),SUSv2 是C (terminate and dump core))。

下面是其它的一些信号

信号 值 处理动作 公布信号的起因
----------------------------------------------------------------------
SIGIOT 6 C IO捉拿号召,与SIGABRT同义
SIGEMT 7,-,7
SIGSTKFLT -,16,- A 协处理器堆栈讹谬
SIGIO 23,29,22 A 某I/O垄断目前能够举行了(4.2 BSD)
SIGCLD -,-,18 A 与SIGCHLD同义
SIGPWR 29,30,19 A 电源故障(System V)
SIGINFO 29,-,- A 与SIGPWR同义
SIGLOST -,-,- A 文件锁失落
SIGWINCH 28,28,20 B 窗口大小改换(4.3 BSD, Sun)
SIGUNUSED -,31,- A 未利用的信号(will be SIGSYS)

(在这里,- 表示信号未曾告终;有三个值给出的含义为,第一个值等闲在Alpha和Sparc上管用,其中的值对应i386和ppc以及sh,最后一个值对应mips。信号29在Alpha上为SIGINFO / SIGPWR ,在Sparc上为SIGLOST。)

处理动作一项中的字母含义如下
A 缺省的动作是终止历程
B 缺省的动作是疏忽此信号
C 缺省的动作是终止历程并举行内核映像转储(dump core)
D 缺省的动作是静止历程
E 信号不能被捉拿
F 信号不能被疏忽

上面推荐的信号是常见系统所扶持的。以表格的形式推荐了各种信号的名目、作用及其在默认情形下的处理动作。各种默认处理动作的含义是:终止过程是指历程退出;疏忽该信号是将该信号丢弃,不做处理;静止过程是指过程挂起,进去静止情形尔后还能重新举行下去,等闲是在调试的过程中(例如ptrace系统调用);内核映像转储是指将历程数据在内存的映像和历程在内核构造中存储的局部内容以定然款式转储到文件系统,并且历程退出厉行,这么做的利益是为过程员供给了得体,使得他们能够获得历程当时厉行时的数据值,批准他们确定转储的起因,并且能够调试他们的过程。

当心 信号SIGKILL和SIGSTOP既不能被捕捉,也不能被疏忽。信号SIGIOT与SIGABRT是一个信号。能够看出,统一个信号在不同的系统中值可能不一样,因而提倡良好利用为信号定义的名字,而不要直接利用信号的值。

二、信 号 机 制

上一节中推荐了信号的大约观念,在这一节中,我们将推荐内核如何告终信号机制。即内核如何向一个历程发送信号、历程如何接收一个信号、历程怎样扼制自己对信号的反响、内核在什么时机处理和怎样处理历程收到的信号。还要推荐一下setjmp和longjmp在信号中起到的作用。

1、内核对信号的大约处理措施

内核给一个历程发送软间断信号的措施,是在历程所在的历程表项的信号域设置对应于该信号的位。这里要赔偿的是,万一信号发送给一个正在睡眠的历程,那么要看该历程进去睡眠的优先级,万一历程睡眠在可被间断的优先级上,则唤醒历程;否则仅设置历程表中信号域相应的位,而不唤醒历程。这一点比拟重要,因为历程察看是否收到信号的时机是:一个历程在即刻从内核态归来到用户态时;可能,在一个历程要进去或脱离一个贴切的低调动优先级睡眠事态时。

内核处理一个历程收到的信号的时机是在一个历程从内核态归来用户态时。因而,当一个历程在内核态下运行时,软间断信号并不即刻起作用,要等到将归来用户态时才处理。历程只有处理完信号才会归来用户态,历程在用户态下不会有未处理完的信号。

内核处理一个历程收到的软间断信号是在该历程的上下文中,因而,历程定然处于运行事态。前面推荐观念的时候讲过,处理信号有三种种类:历程接收到信号后退出;历程疏忽该信号;历程收到信号后厉行用户设定用系统调用signal的函数。当历程接收到一个它疏忽的信号时,历程丢弃该信号,就象未曾收到该信号似的继续运行。万一历程收到一个要捕捉的信号,那么历程从内核态归来用户态时厉行用户定义的函数。而且厉行用户定义的函数的措施很灵便,内核是在用户栈上创立一个新的层,该层中将归来地址的值设置成用户定义的处理函数的地址,这么历程从内核归来弹出栈顶时就归来到用户定义的函数处,从函数归来再弹出栈顶时,才归来原良好入内核的地方。这么做的起因是用户定义的处理函数不能且不批准在内核态下厉行(万一用户定义的函数在内核态下运行的话,用户就能够获得职何权限)。

在信号的处理措施中有几点尤其要引起当心。第一,在一些系统中,当一个历程处理完间断信号归来用户态之前,内核打扫用户区中设定的对该信号的处理例程的地址,即下顺次历程对该信号的处理措施又改为默认值,除非在下顺次信号到来之前再次利用signal系统调用。这可能会使得历程在调用signal之前又获得该信号而导致退出。在BSD中,内核不再打扫该地址。但不打扫该地址可能使得public synchronized void setValues (int height76.xihuanplaza.com,int width) throws