Вопрос

Я пытаюсь написать оболочку, и я нахожусь на том этапе, когда хочу игнорировать 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 ?

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top