一. trap捕捉到信号以后,能够有三种反应方式:shell
(1)执行一段程序来处理这一信号内存
(2)接受信号的默认操做it
(3)忽视这一信号变量
二. trap对上面三种方式提供了三种基本形式:程序
第一种形式的trap命令在shell接收到signal list清单中数值相同的信号时,将执行双command
引号中的命令串。键盘
trap 'commands' signal-listco
trap "commands" signal-list系统
为了恢复信号的默认操做,使用第二种形式的trap命令:
trap signal-list
第三种形式的trap命令容许忽视信号
trap " " signal-list
注意:
(1) 对信号11(段违例)不能捕捉,由于shell自己须要捕捉该信号去进行内存的转储。
(2) 在trap中能够定义对信号0的处理(实际上没有这个信号), shell程序在其终止(如
执行exit语句)时发出该信号。
(3) 在捕捉到signal-list中指定的信号并执行完相应的命令以后, 若是这些命令没有
将shell程序终止的话,shell程序将继续执行收到信号时所执行的命令后面的命令,这样将
很容易致使shell程序没法终止。
另外,在trap语句中,单引号和双引号是不一样的,当shell程序第一次碰到trap语句时,
将把commands中的命令扫描一遍。此时若commands是用单引号括起来的话,那么shell不会
对commands中的变量和命令进行替换, 不然commands中的变量和命令将用当时具体的值来
kill -l能够列出系统的信号
一般咱们须要忽略的信号有四个,即:HUP, INT, QUIT, TSTP,也就是信号1, 2, 3, 24
使用这样的语句可使这些中断信号被忽略:
trap "" 1 2 3 24 或 trap "" HUP INT QUIT TSTP
用 trap :1 2 3 24 或 trap HUP INT QUIT TSTP使其回复默认值。
用stty -a能够列出中断信号与键盘的对应,分别执行上面的命令后,运行
tail -f /etc/passwd, 而后尝试用键盘中断,试试两种状况(默认和忽略)下有何不一样。
更方便的是咱们能够用在shell中用trap定义咱们本身的信号处理程序