2009-03-04 10 views
2

を無視します。私はシェルを書き込もうとしていると私は私が<kbd>Ctrlキー</kbd><kbd>C</kbd>を無視する時点でねCtrl-Cを

私は現在、SIGINTを無視し、信号が来たら新しい行を印刷するプログラムを持っていますが、^Cが印刷されないようにするにはどうすればよいですか?

CtrlキーCを押すと、ここで私が得るものです:

myshell>^C 
myshell>^C 
myshell>^C 

が、私はしたい:ここ

myshell> 
myshell> 
myshell> 

Ctrlキー Cに関連する私のコードです:

extern "C" void disp(int sig) 
{ 
    printf("\n"); 
} 

main() 
{ 
    sigset(SIGINT, disp); 
    while(1) 
    { 
     Command::_currentCommand.prompt(); 
     yyparse(); 
    } 
} 
+0

あなたのプラットフォームでこれをタグ付けしたいと思うかもしれません... – dmckee

答えて

10

それをエコーする端末です。あなたはそれをやめさせるためにそれを伝えなければなりません。 sttyの私のmanページは

* [-]ctlecho 
     echo control characters in hat notation (`^c') 

だからエコーをそのコントロールのスイッチを切ることができ、右のパラメータでのioctlを実行している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 

を実行していると言います。 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を印刷してみますか?