信号是发送到程序的软件中断,以指示发生了重要事件,事件可能会有所不同,从用户请求到非法的内存访问错误。
下表列出了您可能在程序中遇到并希望使用的常见信号-
信号名称 | 信号编号 | 说明 |
---|---|---|
SIGHUP | 1 | 检测到控制终端挂断或控制过程终止 |
SIGINT | 2 | 用户是否发送中断信号(Ctrl + C)时发出 |
SIGQUIT | 3 | 用户是否发送退出信号(Ctrl + D)时发出 |
SIGFPE | 8 | 是否尝试进行非法数学运算 |
SIGKILL | 9 | 如果进程收到此信号,则必须立即退出并且将不执行任何清理操作 |
SIGALRM | 14 | 闹钟信号(用于计时器) |
SIGTERM | 15 | 软件终止信号(默认为终止发送) |
有一种简单的方法可以列出系统支持的所有信号。只需发出 kill -l 命令,它将显示所有支持的信号-
$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
信号的实际列表在Solaris,HP-UX和Linux之间有所不同。
有几种将信号传递到程序或脚本的方法。最常见的一种是让用户在执行脚本时键入 CONTROL-C 或 INTERRUPT键。
当您按 Ctrl + C 键时,会向脚本发送 SIGINT ,并且按照定义的默认操作脚本终止。
传递信号的另一种常见方法是使用 kill命令,其语法如下-
$kill -signal pid
这里的信号是要传递的信号的编号或名称,而 pid 是信号应发送到的进程ID。如-
$kill -1 1001
上面的命令将HUP或挂断信号发送到以进程ID 1001 运行的程序。要将终止信号发送到同一进程,请使用以下命令-
$kill -9 1001
这将杀死以进程ID 1001 运行的进程。
当您在执行Shell程序期间在终端上按 Ctrl + C 或Break键时,通常该程序会立即终止,并返回命令提示符。
捕获这些信号非常容易,并且trap命令具有以下语法-
$trap commands signals
这里的 command 可以是任何有效的Unix命令,甚至可以是用户定义的函数,而signal可以是要捕获的任意数量的信号的列表。
作为trap命令的示例,以下内容显示了如何删除某些文件,然后在有人尝试从终端中止程序时退出并退出-
$trap "rm -f $WORKDIR/work1$$$WORKDIR/dataout$$; exit" 2
从执行该shell程序的角度来看,这两个文件 work1 $$和 dataout $$如果程序接收到2号信号,>将被自动删除。
$trap "rm $WORKDIR/work1$$$WORKDIR/dataout$$; exit" 1 2
现在,如果挂断该行或按下 Ctrl + C 键,这些文件将被删除。
因此,在前面的示例中,将在执行trap命令时替换 WORKDIR 和 $$的值。如果您希望在接收到信号1或2时进行这种替换,则可以将命令放在单引号中-
链接:https://www.learnfk.comhttps://www.learnfk.com/linux/linux-signals-traps.html
来源:LearnFk无涯教程网
$trap 'rm $WORKDIR/work1$$$WORKDIR/dataout$$; exit' 1 2
如果列出的trap命令为空,则在接收到指定的信号时将忽略该信号。如,命令-
$trap '' 2
这指定将忽略中断信号。在执行不想中断的操作时,您可能想忽略某些信号。您可以指定多个要忽略的信号,如下所示:
$trap '' 1 2 3 15
请注意,必须为忽略信号指定第一个参数,并且不等于编写以下内容,后者具有其自身的单独含义-
$trap 2
如果忽略信号,则所有子Shell程序也会忽略该信号。但是,如果您指定要在收到信号后采取的措施,则所有子Shell仍将在收到该信号时采取默认措施。
祝学习愉快!(内容编辑有误?请选中要编辑内容 -> 右键 -> 修改 -> 提交!)