Linux - 信号

Linux - 信号 首页 / Linux入门教程 / Linux - 信号

信号是发送到程序的软件中断,以指示发生了重要事件,事件可能会有所不同,从用户请求到非法的内存访问错误。

下表列出了您可能在程序中遇到并希望使用的常见信号-

信号名称信号编号说明
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仍将在收到该信号时采取默认措施。

祝学习愉快!(内容编辑有误?请选中要编辑内容 -> 右键 -> 修改 -> 提交!)

技术教程推荐

深入浅出区块链 -〔陈浩〕

玩转Git三剑客 -〔苏玲〕

TypeScript开发实战 -〔梁宵〕

DevOps实战笔记 -〔石雪峰〕

Electron开发实战 -〔邓耀龙〕

零基础实战机器学习 -〔黄佳〕

攻克视频技术 -〔李江〕

搞定音频技术 -〔冯建元 〕

程序员职业规划手册 -〔雪梅〕

好记忆不如烂笔头。留下您的足迹吧 :)