티스토리 뷰

반응형

우분투는 리눅스환경이고 터미널로 움직이기때문에 터미널이 선택되어야 키 입력도 가능.

 

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;
}
반응형
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2026/01   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
글 보관함