質問
シェルを作成しようとしていますが、 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();
}
}
解決
そのことをエコーするのは端末です。それをやめるように言わなければなりません。 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を印刷してみてください
所属していません StackOverflow