在Ubuntu主机上开一个shell会话,输入以下内容,用trap命令捕获SIGINT信号(程序终止(interrupt)信号, 在用户键入INTR字符(通常是Ctrl-C)时发出,用于通知前台进程组终止进程)。
trap "echo hello" SIGINT
当键盘输入Ctrl-C时,在命令行的末尾会跟上一个hello字符。
1. 实验一:系统级、用户级测试
在Ubuntu主机上再开启一个shell会话,在新的会话中键盘输入Ctrl-C时,如下图所示,在命令行的末尾并没有跟上一个hello字符。
因此 trap 的作用范围不是系统级,也不是用户级。
2. 实验二:进程级测试
在原本设置trap命令的bash中,使用bash命令新开一个子进程,键盘输入Ctrl-C时,如下图所示,在命令行的末尾并没有跟上一个hello字符。
使用exit退出这个子进程以后,键盘输入Ctrl-C时,在命令行的末尾会跟上一个hello字符。说明trap 的作用范围是在当前进程级,不会传递给其子进程。
3. 实验三:默认行为检测
在上述环境中,用trap命令捕获SIGINT信号(程序终止(interrupt)信号, 在用户键入INTR字符(通常是Ctrl-C)时发出,用于通知前台进程组终止进程)。当键盘输入Ctrl-C时,在命令行的末尾会跟上一个hello字符。那么在此时如果我们需要用Ctrl-C终端某个正在运行的程序是否能够成功。
编写如下测试脚本:
trap 'echo "SIGINT received, but I will not exit!"' SIGINT
echo "Running script. PID: $$"
while true; do
sleep 1
done
在实验二中我们得知了,trap 的作用不会传递给其子进程。所以我们只能够在sh脚本中加入SIGINT信号命令。运行当前脚本,发现无法直接中断这个程序,因为当前发送的SIGINT信号已经被test.sh脚本中的trap命令给捕获处理了。
在这时可以通过kill [: pid进程ID] 的方式终止掉,因为kill 关闭进程发出的信号是 SIGTERM(15),SIGTERM 是请求进程正常终止的信号,test.sh脚本中的trap命令并不会捕获这个信号。
参考
[1]https://mp.weixin.qq.com/s/uXxJSvPDLtcnekOp5Zc-cA
原文始发于微信公众号(蟹堡安全团队):trap作用范围
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论