在bash中,当用户点击ctrl-c(发送SIGINT(时,它会将读线恢复到其原始状态,取消搜索/vi模式/。。。状态
我尝试了UNSETSTATE
宏,但它没有效果,实际上即使是SETSTATE
也对读线的状态没有影响,但rl_readline_state
变量发生了变化。
在信号处理程序中,我尝试过:
RL_UNSETSTATE(RL_STATE_ISEARCH|RL_STATE_NSEARCH|RL_STATE_SEARCH|RL_STATE_VIMOTION|RL_STATE_NUMERICARG|RL_STATE_MULTIKEY);
我试过rl_redisplay()
,但没用。请记住,我有:
rl_catch_signals = 0;
我有一个rl_getc_function
的处理程序。
这是我的代码:https://gitlab.com/abellaismail/minishell/-/blob/dev/src/sig_handler.c
我知道这在某种程度上与42有关。如果你想进一步了解我找到的解决方案是如何工作的,这是我对该项目的回购。假设你的问题适用于当提示等待命令时,你按下ctrl+C(当在heredoc或执行子进程时,行为有点不同(,我调用了以下函数:
void ft_signal_ctrl_c(int sig)
{
(void)sig;
write(2, "n", 1);
rl_replace_line("", 0);
rl_on_new_line();
rl_redisplay();
}
这成功地返回到shell which(running(循环,显示一个新的提示。errno也应该单独更新(ctrl+C给出$?=1(。