문제

나는 껍질을 쓰려고 노력하고 있으며 무시하고 싶은 시점에 있습니다. Ctrl 키.

현재 신호가 올 때 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();
    }
}
도움이 되었습니까?

해결책

그 일을 반향하는 것은 터미널입니다. 당신은 그것을 멈추라 고 말해야합니다. 내 인력 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을 실행하면 컨트롤 Echo OFF를 전환 할 수 있습니다. 들여다보다 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