GNU/Linux >> Belajar Linux >  >> Linux

Menggunakan kbhit() dan getch() di Linux

Jika linux Anda tidak memiliki conio.h yang mendukung kbhit() Anda dapat mencari kode Morgan Mattews di sini untuk memberikan kbhit() fungsionalitas dengan cara yang kompatibel dengan sistem apa pun yang sesuai dengan POSIX.

Sebagai trik menonaktifkan buffering pada tingkat termios, itu juga harus menyelesaikan getchar() masalah seperti yang ditunjukkan di sini.


Howto ncurses yang dikutip di atas dapat membantu. Berikut adalah contoh yang mengilustrasikan bagaimana ncurses dapat digunakan seperti contoh conio:

#include <ncurses.h>

int
main()
{
    initscr();
    cbreak();
    noecho();
    scrollok(stdscr, TRUE);
    nodelay(stdscr, TRUE);
    while (true) {
        if (getch() == 'g') {
            printw("You pressed G\n");
        }
        napms(500);
        printw("Running\n");
    }
}

Perhatikan bahwa dengan ncurses, iostream tajuk tidak digunakan. Itu karena mencampur stdio dengan ncurses dapat memberikan hasil yang tidak diharapkan.

ncurses, ngomong-ngomong, mendefinisikan TRUE dan FALSE . Ncurses yang dikonfigurasi dengan benar akan menggunakan tipe data yang sama untuk bool ncurses sebagai kompiler C++ yang digunakan untuk mengonfigurasi ncurses.


Solusi ringkas berdasarkan jawaban Christophe adalah

#include <sys/ioctl.h>
#include <termios.h>

bool kbhit()
{
    termios term;
    tcgetattr(0, &term);

    termios term2 = term;
    term2.c_lflag &= ~ICANON;
    tcsetattr(0, TCSANOW, &term2);

    int byteswaiting;
    ioctl(0, FIONREAD, &byteswaiting);

    tcsetattr(0, TCSANOW, &term);

    return byteswaiting > 0;
}

Tidak seperti jawaban itu, ini tidak akan membuat terminal dalam keadaan aneh setelah program keluar. Namun, karakter tetap berada di buffer input, sehingga tombol yang ditekan akan muncul dengan tidak diinginkan pada baris prompt berikutnya.

Solusi berbeda yang memperbaiki masalah ini adalah

void enable_raw_mode()
{
    termios term;
    tcgetattr(0, &term);
    term.c_lflag &= ~(ICANON | ECHO); // Disable echo as well
    tcsetattr(0, TCSANOW, &term);
}

void disable_raw_mode()
{
    termios term;
    tcgetattr(0, &term);
    term.c_lflag |= ICANON | ECHO;
    tcsetattr(0, TCSANOW, &term);
}

bool kbhit()
{
    int byteswaiting;
    ioctl(0, FIONREAD, &byteswaiting);
    return byteswaiting > 0;
}

Penggunaannya adalah sebagai berikut

enable_raw_mode();
// ...
if (kbhit()) ...
// ...
disable_raw_mode();
tcflush(0, TCIFLUSH); // Clear stdin to prevent characters appearing on prompt

Sekarang karakter apa pun yang diketik antara eksekusi baris pertama dan terakhir tidak akan muncul di terminal. Namun, jika Anda keluar dengan Ctrl+C, terminal adalah dibiarkan dalam keadaan aneh. (Mendesah)


Linux
  1. Menggunakan ssh-keygen dan berbagi untuk otentikasi berbasis kunci di Linux

  2. Pantau server linux menggunakan Prometheus dan Grafana

  3. Otomatiskan Respons Menggunakan Harapkan dan Ekspektasi Otomatis di Linux

  1. Tetapkan tanggal dan waktu Sistem menggunakan C++ di Linux

  2. Menggunakan rz dan sz di bawah shell linux

  3. Cara mengecek OS dan versi menggunakan perintah Linux

  1. Debug Linux menggunakan ProcDump

  2. Periksa Ruang Disk di Linux Menggunakan Perintah df dan du

  3. Menginstal dan Menggunakan Pengelola Paket Homebrew di Linux