2009-03-04 3 views
2

Я пытаюсь написать оболочку, и я нахожусь в точке, где я хочу игнорировать CtrlC.Игнорирование ctrl-c

В настоящее время у меня есть программа игнорирования 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(); 
    } 
} 
+0

Возможно, вы хотите пометить это своей платформой ... – dmckee

ответ

10

Это терминал, который делает эхо эту вещь. Вы должны сказать это, чтобы прекратить это делать. Моя страница руководства из 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 прочитать строку ввода. Насколько я знаю, у него есть варианты, чтобы остановить работу терминала такими вещами.

0

Попробуйте напечатать символ обратного пространства, aka \ b?

Смежные вопросы