SORU
15 Ocak 2009, PERŞEMBE


C engellenmeyen klavye girişi

Kullanıcı bir tuşa bastığında, ama bir tuşa basarak her döngü devam gerektirmeyecektir kadar döngüsü C (linux üzerinde) bir program yazmaya çalışıyorum.

Bunu yapmak için basit bir yolu var mı? Muhtemelen select ile bunu yapabileceğimi düşündüm() ama bu çok uzun bir iş gibi görünüyor.

Kontrol-c tuşa basarak bir program engellenmeyen ıo yerine kapanmadan önce temizlik yapmak için yakalamak için bir yolu var alternatif olarak?

CEVAP
15 Ocak 2009, PERŞEMBE


Ayrıca daha önce de belirttiğimiz gibi, tuzak için sigaction kullanabilirsiniz ctrl-c veya select tuzağa düşürmek için herhangi bir standart girdi.

İkinci yöntem de karakter-de-bir-zaman yerine-at-a-line zaman modunda " TTY ayarlamanız gerekir unutmayın. İkincisi, eğer basın kadar çalışan programın stdin gönderilen almaz bir metin satırı yazın girin eğer varsayılan.

İcanon ile modunu kapatmak için tcsetattr() Bu fonksiyonu kullanmak için ihtiyacınız olacak, ve muhtemelen de devre dışı bırakmak çok YANKI. Bellek, ayrıca program olduğunda terminali icanon ile moduna ayarlamak zorunda!

Sadece bütünlüğü için, burada sadece (not: hiçbir hata denetimi!) hamile olduğum bazı kodlar var Unix TTY kurar ve DOS <conio.h> fonksiyonlar kbhit() getch(): öykünen

#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/select.h>
#include <termios.h>

struct termios orig_termios;

void reset_terminal_mode()
{
    tcsetattr(0, TCSANOW, &orig_termios);
}

void set_conio_terminal_mode()
{
    struct termios new_termios;

    /* take two copies - one for now, one for later */
    tcgetattr(0, &orig_termios);
    memcpy(&new_termios, &orig_termios, sizeof(new_termios));

    /* register cleanup handler, and set the new terminal mode */
    atexit(reset_terminal_mode);
    cfmakeraw(&new_termios);
    tcsetattr(0, TCSANOW, &new_termios);
}

int kbhit()
{
    struct timeval tv = { 0L, 0L };
    fd_set fds;
    FD_ZERO(&fds);
    FD_SET(0, &fds);
    return select(1, &fds, NULL, NULL, &tv);
}

int getch()
{
    int r;
    unsigned char c;
    if ((r = read(0, &c, sizeof(c))) < 0) {
        return r;
    } else {
        return c;
    }
}

int main(int argc, char *argv[])
{
    set_conio_terminal_mode();

    while (!kbhit()) {
        /* do some work */
    }
    (void)getch(); /* consume the character */
}

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • DancingIsAPassion

    DancingIsAPa

    29 AĞUSTOS 2009
  • Jesse Pimenta

    Jesse Piment

    5 EKİM 2011
  • TROPFEST

    TROPFEST

    27 Mart 2007