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
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 */
}
iPhone: metin girişi için klavye sayıs...
Visual Studio rasgele Amerikan klavye ...
Visual Studio tüm sekmeleri kapatmak i...
iPad klavye, kalıcı ViewController sun...
Kaydırma UİTableView zaman klavye gizl...