"ESC" 키를 누르면 종료하게 됩니다.
Escape seq 로 진입하는 경우에 대한 코드는 머리가 복잡하여 좀 고민좀 해봐야 겠네요.
Escape seq 로 진입하는 경우에 대한 코드는 머리가 복잡하여 좀 고민좀 해봐야 겠네요.
| 코드: |
| /*
Copyright (C) Information Equipment co.,LTD. All rights reserved. Code by JaeHyuk Cho <mailto:minzkn@infoeq.com> CVSTAG="$Header$" */ #include <sys/types.h> #include <stdio.h> #include <stdlib.h> #include <memory.h> #include <unistd.h> #include <fcntl.h> #include <termios.h> int main(void) { struct termios s_termios, s_termios_save; int s_key, s_break, s_read_bytes, s_index; unsigned char s_buffer[ 128 ]; if(tcgetattr(STDIN_FILENO, (struct termios *)(&s_termios)) == 0) { (void)memcpy((void *)(&s_termios_save), (void *)(&s_termios), (size_t)sizeof(struct termios)); #if 0 /* blocking */ s_termios.c_lflag &= ~(ECHO | ICANON | ISIG); s_termios.c_iflag &= ~(BRKINT); #else s_termios.c_lflag |= (ISIG); s_termios.c_lflag &= ~(ECHO | ICANON); s_termios.c_iflag |= (BRKINT); s_termios.c_iflag &= ~(IGNBRK); #endif s_termios.c_cc[VMIN] = 1; s_termios.c_cc[VTIME] = 0; if(tcsetattr(STDIN_FILENO, TCSAFLUSH, (struct termios *)(&s_termios)) == 0) { s_break = 0; do { /* read */ s_read_bytes = (int)read(STDIN_FILENO, (void *)(&s_buffer[0]), (size_t)sizeof(s_buffer)); if(s_read_bytes <= 0)continue; /* debug */ (void)fputs("VT CODE=\"", stdout); for(s_index = 0;s_index < s_read_bytes;s_index++) { if(s_buffer[s_index] == 0x1b)(void)fputs("ESC", stdout); else if((s_buffer[s_index] >= ' ') && (s_buffer[s_index] <= 0x7e))(void)fputc((int)s_buffer[s_index], stdout); else (void)fprintf(stdout, "(%02XH)", (int)s_buffer[s_index]); } (void)fputs("\"\n", stdout); /* key map */ if(s_read_bytes == 1)s_key = (int)s_buffer[0]; else { /* escape seq */ s_key = 0; } /* select */ switch(s_key) { case 0x0000001b: s_break = 1; break; /* ESC key */ default: break; } }while(s_break == 0); /* restore termios */ if(tcsetattr(STDIN_FILENO, TCSAFLUSH, (struct termios *)(&s_termios_save)) == 0) { (void)fprintf(stdout, "leave\n"); } else (void)fprintf(stdout, "error: tcsetattr\n"); } else (void)fprintf(stdout, "error: tcsetattr\n"); } else (void)fprintf(stdout, "error: tcgetattr\n"); return(0); } /* End of source */ |




댓글을 달아 주세요