Игнорирование ctrl-c
-
03-07-2019 - |
Вопрос
Я пытаюсь написать оболочку, и я нахожусь на том этапе, когда хочу игнорировать CtrlC.
В настоящее время моя программа игнорирует SIGINT и печатает новую строку при поступлении сигнала, но как я могу предотвратить ^C
от того, что его напечатали?
При нажатии CtrlC, вот что я получаю:
myshell>^C
myshell>^C
myshell>^C
но я хочу:
myshell>
myshell>
myshell>
Вот мой код, имеющий отношение к CtrlC:
extern "C" void disp( int sig )
{
printf("\n");
}
main()
{
sigset( SIGINT, disp );
while(1)
{
Command::_currentCommand.prompt();
yyparse();
}
}
Решение
Это терминал, который действительно повторяет эту штуку.Вы должны сказать ему, чтобы он прекратил это делать.Моя личная страница из stty
говорит
* [-]ctlecho
echo control characters in hat notation (`^c')
Выполняется strace stty ctlecho
Шоу
ioctl(0, SNDCTL_TMR_TIMEBASE or TCGETS, {B38400 opost isig icanon echo ...}) = 0
ioctl(0, SNDCTL_TMR_STOP or TCSETSW, {B38400 opost isig icanon echo ...}) = 0
ioctl(0, SNDCTL_TMR_TIMEBASE or TCGETS, {B38400 opost isig icanon echo ...}) = 0
Таким образом, запуск ioctl с правильными параметрами может отключить это управляющее эхо.Загляни в man termios
для удобного интерфейса к ним.Использовать их очень просто
#include <termios.h>
#include <unistd.h>
#include <stdio.h>
void setup_term(void) {
struct termios t;
tcgetattr(0, &t);
t.c_lflag &= ~ECHOCTL;
tcsetattr(0, TCSANOW, &t);
}
int main() {
setup_term();
getchar();
}
В качестве альтернативы, вы можете рассмотреть возможность использования GNU readline
чтобы прочитать строку входных данных.Насколько я знаю, у него есть варианты, чтобы остановить терминал, выполняющий подобные действия.
Другие советы
Попробуйте напечатать символ обратного пробела, он же \b ?