trap作用范围

admin 2024年8月2日00:12:05评论9 views字数 1011阅读3分22秒阅读模式

在Ubuntu主机上开一个shell会话,输入以下内容,用trap命令捕获SIGINT信号(程序终止(interrupt)信号, 在用户键入INTR字符(通常是Ctrl-C)时发出,用于通知前台进程组终止进程)。

trap "echo hello" SIGINT

当键盘输入Ctrl-C时,在命令行的末尾会跟上一个hello字符。

trap作用范围

1. 实验一:系统级、用户级测试

在Ubuntu主机上再开启一个shell会话,在新的会话中键盘输入Ctrl-C时,如下图所示,在命令行的末尾并没有跟上一个hello字符。

trap作用范围

因此 trap 的作用范围不是系统级,也不是用户级。

2. 实验二:进程级测试

在原本设置trap命令的bash中,使用bash命令新开一个子进程,键盘输入Ctrl-C时,如下图所示,在命令行的末尾并没有跟上一个hello字符。

trap作用范围

使用exit退出这个子进程以后,键盘输入Ctrl-C时,在命令行的末尾会跟上一个hello字符。说明trap 的作用范围是在当前进程级,不会传递给其子进程。

3. 实验三:默认行为检测

在上述环境中,用trap命令捕获SIGINT信号(程序终止(interrupt)信号, 在用户键入INTR字符(通常是Ctrl-C)时发出,用于通知前台进程组终止进程)。当键盘输入Ctrl-C时,在命令行的末尾会跟上一个hello字符。那么在此时如果我们需要用Ctrl-C终端某个正在运行的程序是否能够成功。

编写如下测试脚本:

#!/bin/bashtrap 'echo "SIGINT received, but I will not exit!"' SIGINTecho "Running script. PID: $$"while true; do    sleep 1done

在实验二中我们得知了,trap 的作用不会传递给其子进程。所以我们只能够在sh脚本中加入SIGINT信号命令。运行当前脚本,发现无法直接中断这个程序,因为当前发送的SIGINT信号已经被test.sh脚本中的trap命令给捕获处理了。

trap作用范围

在这时可以通过kill [: pid进程ID] 的方式终止掉,因为kill 关闭进程发出的信号是 SIGTERM(15),SIGTERM 是请求进程正常终止的信号,test.sh脚本中的trap命令并不会捕获这个信号。

trap作用范围

参考

[1]https://mp.weixin.qq.com/s/uXxJSvPDLtcnekOp5Zc-cA

原文始发于微信公众号(蟹堡安全团队):trap作用范围

免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2024年8月2日00:12:05
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   trap作用范围https://cn-sec.com/archives/3023081.html
                  免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉.

发表评论

匿名网友 填写信息