如何处理从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程序验证这一点。

+0

我不确定这是我想要的 - 如果我输入'exit'并按下Ctrl-C,我希望它丢弃退出并给我一个新的提示。 – CGanote