加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

BASH打破了SIGINT的读取线

发布时间:2020-12-15 21:00:33 所属栏目:安全 来源:网络整理
导读:我尝试在套接字上的读取循环中捕获SIGINT ctrl c,但我要求的中断仅在新行之后得到处理.因此,当我按下我正在运行的应用程序时,我必须等待一个新行到达套接字才能在循环中断/应用程序退出之前 这是最小版本: trap "break" SIGINT SIGHUP SIGTERMexec 3/dev/tc
我尝试在套接字上的读取循环中捕获SIGINT ctrl c,但我要求的中断仅在新行之后得到处理.因此,当我按下我正在运行的应用程序时,我必须等待一个新行到达套接字才能在循环中断/应用程序退出之前

这是最小版本:

trap "break" SIGINT SIGHUP SIGTERM
exec 3<>/dev/tcp/192.168.1.84/50885

while read line  
do   
   echo -e "$linen" 
done <&3

我怎样才能立即打破循环并退出应用程序?

解决方法

休息不是一个真正的命令,你可以在任何你想要的地方执行;它只是一个语法结构来标记一个离开周围循环的点.你的中断没有周围的循环,所以它没有意义(并且是一个错误:bash:break:仅在’for’,`while’或`until’循环中有意义).

您需要删除read命令:

trap "killRead" SIGINT SIGHUP SIGTERM

killRead() {
  kill $(cat /tmp/read.pid)
}

exec 3<>/dev/tcp/192.168.1.84/50885

while read line  
do   
   echo -e "$linen" 
done <&3 & pid=$!

echo $pid > /tmp/read.pid

wait $pid

当然,这只是一个非常粗略的解决方案,不会隐藏由终止子壳等发出的任何错误消息.但它显示了这个想法并解决了你问的问题.为了隐藏预期的错误消息等,你可能想问其他问题(或者只是在这里搜索已经给出的答案;-)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读