简单的Linux Shell。停止命令

时间:2013-02-14 22:28:41

标签: c shell

我正在尝试在linux中实现一个简单的shell,它应具备的一个功能是允许用户按<ctrl+D>并使其停止正在进行的操作 - 基本上正是<ctrl+C>在Bash。

现在我想知道最简单的方法,我正在考虑某种关键的监听器,它会使当前的任务停止。现在,我能想到这样做的唯一方法就是有一个单独的线程,它会强制停止并将主线程返回到基本状态,在那里它可以获取新的输入。

单独的线程是“不断”监听正确按键的唯一方法。

我希望对此有一些想法,也许是一种更好的方法。

[编辑] 我正在尝试创建一个简单的shell,它可以执行外部程序,打印/更改目录,打印/设置路径,打印命令历史记录,从历史记录调用命令以及打印/设置/删除命令别名。 CTRL-D相当于Bash中的CTRL-C,它允许用户立即退出当前正在运行的程序,而不是退出shell本身。 [/编辑]

3 个答案:

答案 0 :(得分:1)

为什么不处理Ctrl-C

这只是诱捕信号的许多SO之一:Catch Ctrl-C in C

Ctrl-D通常代表标准输入上的EOF。你不应该搞砸它。

答案 1 :(得分:1)

如果您希望 Control-D 字符为您生成中断,则:

  1. 您需要将EOF字符映射到 Control-D 以外的其他字符。
  2. 您需要将中断字符映射到 Control-D
  3. 您可以在POSIX中使用<termios.h>标题和函数执行此操作:

    您使用struct termios检索tcgetattr()中的当前属性。您将复制该结构,并修改(为了论证)该副本,更改由c_ccVINTR索引的VEOF数组的元素(以及任何其他更改)您要制作),然后使用tcsetattr()设置新属性。您还可以安排确保在shell退出之前恢复原始终端设置(通过使用tcsetattr()检索的原始属性集再次调用tcgetattr())。这可以通过使用atexit()注册的处理程序或其他机制来完成。您应该尽力在所有情况下重置终端属性。关于杀死你的SIGKILL你无能为力。

    在测试时,请为自己制作一个小脚本:

    echo stty $(stty -g) > sane
    chmod u+x sane
    

    以专为stty设计的形式记录当前(可能是理智的)终端设置,以便可靠地读取。如果(当)你的shell出现问题,可以使用 Control-J sane Control-J 运行脚本并将终端重置回已知的理智设置。如果您正在开发使用curses库的程序,这也很有用。

答案 2 :(得分:0)

除非我对其他答案的评论不正确,否则我认为你应该做的是:

 if (!fgets(input, sizeof(input), stdin) == NULL)
 {
    ... do cleanup here ... 
    exit(0);
 }

或类似的东西。