2009-03-04 114 views
2

我正在嘗試編寫一個shell並且我處於我想忽略的位置CtrlC忽略ctrl-c

我目前有我的程序忽略SIGINT並在信號出現時打印新行,但是如何防止^C被打印?

Ctrl鍵Ç當,這裏是我得到:

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

,但我想:

myshell> 
myshell> 
myshell> 

下面是有關按CtrlÇ我的代碼:

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

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

也許你想標記這與你的平臺... – dmckee 2009-03-04 01:33:56

回答

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

嘗試打印退格字符,又名\ b?