如何处理从bash中的标准输入读取中断信号
我在玩bash读取功能。我喜欢我目前shell中的一个简单图层。读-e没有tab-complete和以前的命令,并且用ctrl + d发送EOF让我回到我的原始shell。这里是我的参考:如何处理从bash中的标准输入读取中断信号
Bash (or other shell): wrap all commands with function/script
我想一些帮助处理SIGINT,CTRL + C。在一个正常的shell中,如果你开始输入并在中途点击^ C,它会立即结束该行。对于这个简单的例子,在^ C之后,我仍然必须在注册之前返回。
我该如何保持readline所具有的好处,但仍能正确处理SIGINT?理想情况下,它会向while循环发送continue语句,或者以某种方式将\ n发送到STDIN,在那里等待我的读取。
示例代码:
#!/bin/bash
# Emulate bash shell
gtg=1
function handleCtrl-C {
# What do I do here?
gtg=0
return
}
trap handleCtrl-C INT
while read -e -p "> " line
do
if [[ $gtg == 1 ]] ; then
eval "$line"
fi
gtg=1
done
读书人7信号告诉一些系统调用的可重新启动的标志设置,结果将返回到命令
对于某些系统调用,如果信号在执行呼叫 时被捕获,并且呼叫过早终止,呼叫自动重新启动的 。任何安装了信号(3)的处理程序将 都设置了SA_RESTART标志,这意味着任何可重新启动的系统调用 在收到信号后都不会返回。受影响的系统调用 包括读取(2),写入(2),sendto(2),recvfrom(2),sendmsg(2)和 recvmsg(2)在通信通道或低速设备上,以及 ioctl(2)或等待(2)。但是,已提交 的呼叫未重新启动,而是返回部分成功(对于 示例,读取次数较短)。这些语义可以用 siginterrupt(3)进行更改。
您可以尝试打印输入到行的值,并确认在CtrlC返回之后读取被恢复,直到命中新行。输入类似“exit”的内容,然后按Ctrl-C,然后“退出”输出结果为“exitexit”。作如下改动并运行上述测试案例
echo ">$line<"
if [ $gtg == 1 ] ; then
你会输出作为
你可以用一个C程序验证这一点。
我不确定这是我想要的 - 如果我输入'exit'并按下Ctrl-C,我希望它丢弃退出并给我一个新的提示。 – CGanote