mjune.kim 2019. 3. 4. 14:45
void set_mode(int want_key) {
    static struct termios old, newk;
    if (!want_key) {
        tcsetattr(STDIN_FILENO, TCSANOW, &old);
        return;
    }

    tcgetattr(STDIN_FILENO, &old);
    newk = old;
    newk.c_lflag &= ~(ICANON | ECHO);
    tcsetattr(STDIN_FILENO, TCSANOW, &newk);
}

int get_key() {
    int c = 0;
    struct timeval tv;
    fd_set fs;
    tv.tv_usec = tv.tv_sec = 0;

    FD_ZERO(&fs);
    FD_SET(STDIN_FILENO, &fs);
    select(STDIN_FILENO + 1, &fs, 0, 0, &tv);

    if (FD_ISSET(STDIN_FILENO, &fs)) {
        c = getchar();
        set_mode(0);
    }

    return c;
}

void run() {
    int c;
    while (1) {
        set_mode(1);
        while(!(c = get_key())) usleep(10000);
        cout << "key = " << c << endl;

        if (c == 101)
            break;
    }
}
댓글수0