【发布时间】:2017-03-22 18:50:27
【问题描述】:
我正在用 C 重写一个 shell,但遇到了一个问题。
在编写命令时——例如 echo "this——我们得到了一个新的提示符(“dquote>”,在 zsh 中),我们可以使用“Ctrl + c”退出它并返回到上一个命令提示符。
我被困在那里;我只是无法摆脱我的读取功能(听“dquote>”),我试图在按“ctrl + c”时在标准输出上写入一个EOF,但它没有读取它。
我切换到非规范模式。
我用signal(SIGINT, sig_hand);捕捉信号
然后我在信号被捕获时执行这部分代码:
static void sig_hand(int sig)
{
if (g_shell.is_listen_bracket) // if is the first prompt or no
putchar(4); // EOT
else
{
putstr("\n");
print_prompt();
}
}
还有我的阅读功能:
int j;
char command[ARG_MAX];
char buff[3];
j = -1;
while (1)
{
bzero(buff, 3);
read(0, buff, 3);
if (buff[0] == 4 && !buff[1] && !buff[2])
return (ctrl_d(shell));
else if (isprint(buff[0]) && !buff[1] && !buff[2]) // if is between 32 and 126 (ascii)
{
command[++j] = buff[0];
putchar(buff[0]);
}
}
command[++j] = '\0';
return (strdup(command));
所以我的代码正在等待“read(0, buff, 3);”,我想在按下 ctrl + c 时退出它。
感谢您的帮助!
【问题讨论】:
-
man siglongjmp -
感谢您的回复,但是是学校项目,这个功能是不允许的。
-
不清楚您的问题是什么,因为您没有显示任何代码或讨论您是否在 shell 中操作信号处理或终端设置。您可能会发现 Canonical vs non-canonical terminal input 很有帮助,或者它可能是一个红鲱鱼。您应该讨论(更好地,展示)您的外壳如何处理信号。 Control-C 应该生成一个 SIGINT;如果你的 shell 忽略了这一点,或者处理不当,它可能会导致你的麻烦。
-
好吧,从技术上讲,它不是一个函数,虽然它看起来是。
-
我编辑了我的问题。 (Ctrl + d 效果很好)