티스토리 뷰
반응형
우분투는 리눅스환경이고 터미널로 움직이기때문에 터미널이 선택되어야 키 입력도 가능.
Linux 환경에서 키보드 입력 버퍼에 데이터가 있는지 확인하는 방법에는 여러 가지가 있습니다. 아래에는 두 가지 일반적인 방법을 소개합니다.
1) select 함수 사용:
select 함수를 사용하면 여러 파일 디스크립터에 대한 I/O 이벤트를 감시할 수 있습니다. 이를 통해 키보드 입력을 확인할 수 있습니다.
| #include <stdio.h> #include <stdlib.h> #include <sys/select.h> #include <sys/time.h> #include <sys/types.h> #include <unistd.h> int kbhit() { struct timeval tv; fd_set fds; tv.tv_sec = 0; tv.tv_usec = 0; FD_ZERO(&fds); FD_SET(STDIN_FILENO, &fds); // 표준 입력 디스크립터를 감시 select(STDIN_FILENO + 1, &fds, NULL, NULL, &tv); return FD_ISSET(STDIN_FILENO, &fds); } int main() { while (1) { printf("While loop is running...\n"); // 키보드 입력이 있는지 확인 if (kbhit()) { char key = getchar(); if (key == 'q') { printf("Exiting the loop.\n"); break; } } // 기타 작업 수행 // ... usleep(500000); // 예제에서는 0.5초 대기 } return 0; } |
2) termios 사용:
termios를 사용하여 터미널을 설정하고, fcntl 함수를 사용하여 Non-blocking 모드로 설정한 후 getchar를 사용하여 키 입력을 확인할 수 있습니다.
| #include <stdio.h> #include <stdlib.h> #include <termios.h> #include <unistd.h> #include <fcntl.h> int kbhit() { struct termios oldt, newt; int ch; int oldf; // 현재 터미널 설정 저장 tcgetattr(STDIN_FILENO, &oldt); // 터미널을 Non-blocking 모드로 변경 newt = oldt; newt.c_lflag &= ~(ICANON | ECHO); tcsetattr(STDIN_FILENO, TCSANOW, &newt); // 키 입력 확인 oldf = fcntl(STDIN_FILENO, F_GETFL, 0); fcntl(STDIN_FILENO, F_SETFL, oldf | O_NONBLOCK); ch = getchar(); // 터미널 설정 복원 tcsetattr(STDIN_FILENO, TCSANOW, &oldt); // Non-blocking 모드 해제 fcntl(STDIN_FILENO, F_SETFL, oldf); // 키 입력이 있으면 1, 없으면 0 반환 return ch != EOF; } int main() { while (1) { printf("While loop is running...\n"); // 키보드 입력이 있는지 확인 if (kbhit()) { char key = getchar(); if (key == 'q') { printf("Exiting the loop.\n"); break; } } // 기타 작업 수행 // ... usleep(500000); // 예제에서는 0.5초 대기 } return 0; } |
반응형
'초보 우분투(리눅스)' 카테고리의 다른 글
| 리눅스는 바이러스에 대해 안전한가? 그렇다면 이유는? (0) | 2024.02.24 |
|---|---|
| .Trash-1000 (0) | 2024.02.24 |
| Tegra device (0) | 2024.02.18 |
| 우분투 터미널에서 'xxx'경로를 폴더창으로 열어주는 쉘스크립트 (0) | 2024.02.18 |
| 우분투-네트워크로 설치 (0) | 2024.02.18 |

