【问题标题】:Simple Linux Shell. stop command简单的 Linux Shell。停止命令
【发布时间】:2013-02-14 22:28:40
【问题描述】:

我正在尝试在 linux 中实现一个简单的 shell,它应该具有的功能之一是让用户能够按下 <ctrl+D> 并让它停止它正在做的任何事情 - 基本上正是 <ctrl+C> 在 Bash 中所做的。

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

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

我希望对此有一些想法,并可能有更好的解决方法。

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

【问题讨论】:

  • 对我来说,这似乎是一个非常合理、真实、建设性的问题。建议/期望的键盘映射是不寻常的,但这并没有错;它只是不同。您可能会问“您尝试过什么”,但这个问题基本上是合理的。

标签: c shell


【解决方案1】:

你为什么不直接处理Ctrl-C

这只是关于捕获信号的众多 SO 讨论之一:Catch Ctrl-C in C

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

【讨论】:

  • 您的 shell 应该不断提示用户输入并读取和处理任何用户输入,直到用户键入“exit”或“-D”。请注意,在后一种情况下,我们实际上是在关闭标准输入,这会在尝试从中读取时出错。因此,您需要使用它作为退出循环的一种方式不幸的是,它在我给出的规范中。
  • 我认为您误解了说明。尝试在常规 shell 中使用“CTRL-D”。它将退出外壳。它应该这样做。但是,如果您在当前正在运行的程序中使用 CTRL-D,shell 将不会接收该输入,您也不应该尝试这样做,因为这对当时正在运行的应用程序意味着什么。跨度>
  • 我想我已经理解你的意思了,但如果我是迟钝的,我很抱歉。我已经编辑了这个问题,以使我想问的更清楚。
【解决方案2】:

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

  1. 您需要将 EOF 字符映射到 Control-D 以外的其他字符。
  2. 您需要将中断字符映射到 Control-D

您在 POSIX 中使用 <termios.h> 标头和函数执行此操作:

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

当你测试这个时,为自己编写一个小脚本:

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

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

【讨论】:

    【解决方案3】:

    除非我对另一个答案的评论不正确,否则我认为您应该做的是:

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

    或类似的东西。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-06
      • 1970-01-01
      • 2013-11-21
      • 1970-01-01
      • 2011-03-07
      • 2023-03-24
      相关资源
      最近更新 更多