1

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

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

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

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

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

4

3 回答 3

1

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

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

Ctrl-D一般代表EOF标准输入。你不应该惹它。

于 2013-02-14T22:46:17.330 回答
1

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

  1. 您需要将 EOF 字符映射到Control-D.
  2. 您需要将中断字符映射到Control-D.

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

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

在测试时,为自己编写一个小脚本:

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

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

于 2013-02-15T03:59:52.783 回答
0

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

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

或与之等效的东西。

于 2013-02-14T23:32:19.877 回答