170 likes | 456 Vues
단말기의 비정규 입력. 컴퓨터 정보학부 2003242091 윤 현 철. ※ 목 차. 프로그램 개요 주요 항목 요약 소스 소개 시현. ※ 개 요. 예제 5-2 프로그램 타이핑 연습 프로그램 작성 잘못 입력 시 경고음과 특수문자 출력. ※ 주요 항목 요약. ioctl TCGETA TCSETAW TCSETAF c_lflag ISIG ICANON ECHO c_cc VMIN fileno isatty setbuf. ※ ioctl< 장치제어 >.
E N D
단말기의 비정규 입력 컴퓨터 정보학부 2003242091 윤 현 철
※ 목 차 • 프로그램 개요 • 주요 항목 요약 • 소스 소개 • 시현
※ 개 요 • 예제 5-2 프로그램 • 타이핑 연습 프로그램 작성 • 잘못 입력 시 경고음과 특수문자 출력
※ 주요 항목 요약 • ioctl • TCGETA • TCSETAW • TCSETAF • c_lflag • ISIG • ICANON • ECHO • c_cc • VMIN • fileno • isatty • setbuf
※ ioctl<장치제어> • int ioctl(int fildes, int request, struct termio) • 장치 하드웨어, 드라이버 소프트웨어 옵션 세트 • 장치마다 동작들이 다름 • 장치 드라이버에 의해 정의
※ int ioctl(…, TCGETA, &tty) • Ioctl이 단말기의 현재상태를 tty에 복사
※ int ioctl(…, TCSETAW, &tty) • tty의 값으로 단말기의 상태를 지정 • 값 지정 전 출력 큐가 비워질 때까지 대기 • 단말기 출력에 관한 인수 변경할 때 사용
※ int ioctl(…, TCSETAF, &tty) • 출력 큐가 비워질 때까지 대기 • 입력 큐를 청소 • 단말기의 상태를 TTY값으로 지정
※ c_lflag • 단말기의 기능 제어 • ISIG –특수 제어 문자와 비교하여 검사 • ICANON –정규 처리 기능 • ECHO –입력된 문자의 반향 출력 정규 처리 설정 시 가능
※ c_cc • 제어 문자가 정의된 배열 • VMIN –입력 문자의 수
※ fileno(stdout) • 스트림의 파일 핸들 조사 • 반환값은 조사한 파일의 핸들값
※ isatty(fileno(stdout)) • 인수가 문자입출력용 장치와 연결되있나 조사 • 장치파일은 0 이외의 값, 그 외는 0을 리턴
※ setbuf(stdout, (char *)NULL) • 별도의 버퍼 사용하고 싶을 경우 사용 • 이 경우 데이터는 스트림에 바로 출력
※ 소스 소개 (1) #include <stdio.h> #include <fcntl.h> #include <termio.h> #include <stdlib.h> //2)exit()함수 #include <string.h> //3)strlen()함수 main(argc,argv) int argc; char *argv[];{ char ch, *text = "My name is Yoon Hyun Chul"; int fd, i, errors = 0, len; //1)open(),strlen() 삭제 struct termio tty, savtty; //단말기 문자 특수 파일 open fd = open("/dev/tty", O_RDONLY);
※ 소스 소개 (2) //단말기의 현재 특성을 얻음 ioctl(fd, TCGETA, &tty); //함수 이용, 현재 출력 파일이 단말기인지 검사 if(isatty(fileno(stdout)) == 0){ fprintf(stderr,"stdout not terminal\n"); exit(1); } savtty = tty; //비정규모드,비반향, 비검사 모드로 세트 tty.c_lflag &= ~(ISIG | ICANON | ECHO); //한 문자 입력 대기 tty.c_cc[VMIN] = 1; /* MIN */ //새로운 플래그 설정 ioctl(fd, TCSETAW, &tty); //putchar함수가 즉시 write 시스템 호출을 이용 ,출력하게끔 설정 setbuf(stdout, (char *) NULL);
※ 소스 소개 (3) printf("Type beneath th efollowing line\n\n%s\n", text); len = strlen(text); for(i=0; i<len; i++){ read(fd, &ch,1); //입력 if(ch == text[i]) //문자가 같을경우 putchar(ch); //출력 else{ putchar('\07'); //경고음 putchar('*'); //문자출력 errors++; //에러개수카운트 } }//End of for loop //본래의 단말기 상태를 재설정 ioctl(fd, TCSETAF, &savtty); printf("\n\nnumber of errors: %d\n",errors); }//End of main function