Linux konsolunu kullanıyorum ve ESC'ye basılana kadar rasgele karakterler çıkaran bir program yapmak istiyorum. Böyle bir klavye işleyicisini nasıl yapabilirim? Curses kütüphanesindenC'deki bir Linux konsolunda basılan tuş nasıl kullanılır?
cevap
getch() belki? Ayrıca, bir sonraki tuşa basmak için getch() 'ı söylemek için notimeout()' ı kullanmanız gerekecektir. u sadece getchar()
bir engelleme fonksiyonu olduğu için, esc
Char sonra enter
basmanız gerekir Bu programda
(N) curses kütüphanesinden bahsettiğiniz açıkça belirtilmelidir. –
Evet, tabi. Güncellenmiş. Teşekkürler. –
not: ncurses'dan getch(), başlatılması gereken uygun ncurses "ekran" a ihtiyaç duyar, yoksa işe yaramaz. – ShinTakezou
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <signal.h>
char * me = "Parent";
void sigkill(int signum)
{
//printf("=== %s EXIT SIGNAL %d ===\n", me, signum);
exit(0);
}
main()
{
int pid = fork();
signal(SIGINT, sigkill);
signal(SIGQUIT, sigkill);
signal(SIGTERM, sigkill);
if(pid == 0) //IF CHILD
{
int ch;
me = "Child";
while(1)
{
ch = (rand() % 26) + 'A'; // limit range to ascii A-Z
printf("%c",ch);
fflush(stdout); // flush output buffer
sleep(2); // don't overwhelm
if (1 == getppid())
{
printf("=== CHILD EXIT SINCE PARENT DIED ===\n");
exit(0);
}
}
printf("==CHILD EXIT NORMAL==\n");
}
else //PARENT PROCESS
{
int ch;
if((ch = getchar())==27)
kill(pid, SIGINT);
//printf("==PARENT EXIT NORMAL (ch=%d)==\n", ch);
}
return(0);
}
. Ayrıca, çocuk işlemi için ihtiyaç duyulduğunda uyku süresini kaldırabilir veya azaltabilir.
'getchar' hariç, giriş için bekler, bu nedenle' getchar', kullanıcının [Enter] tuşuna basmasını beklerken rastgele karakterler çıkmaz. –
değişim tek tuşla için tty ayarları:
int getch(void) {
int c=0;
struct termios org_opts, new_opts;
int res=0;
//----- store old settings -----------
res=tcgetattr(STDIN_FILENO, &org_opts);
assert(res==0);
//---- set new terminal parms --------
memcpy(&new_opts, &org_opts, sizeof(new_opts));
new_opts.c_lflag &= ~(ICANON | ECHO | ECHOE | ECHOK | ECHONL | ECHOPRT | ECHOKE | ICRNL);
tcsetattr(STDIN_FILENO, TCSANOW, &new_opts);
c=getchar();
//------ restore old settings ---------
res=tcsetattr(STDIN_FILENO, TCSANOW, &org_opts);
assert(res==0);
return(c);
}
ICRNL, 'c_iflag' alanına değil, 'c_lflag' alanına girmiyor mu? –
bir terminal cihazı için hat disiplin genellikle varsayılan olarak kanonik modunda çalışır. Bu modda, terminal sürücüsü, yeni satır görülünceye kadar arabelleği kullanıcı alanına sunmaz (Gir tuşuna basılır).
Terminali, termios
yapısını değiştirmek için tcsetattr()
kullanarak ham (düz olmayan) moda ayarlayabilirsiniz. Sırasıyla ECHO
ve ICANON
bayraklarının temizlenmesi, yazılan karakterlerin yankılanmasını devre dışı bırakır ve okuma isteklerinin doğrudan giriş kuyruğundan sağlanmasına neden olur. VTIME
ve VMIN
değerlerini c_cc
dizisinde sıfır olarak ayarlamak, okuma isteğinin (fgetc()
) engellenmek yerine hemen geri dönmesine neden olur; etkili bir şekilde stdin. fgetc()
numaralı çağrıya, akışta bir karakter yoksa, EOF
dönecektir.
#define _XOPEN_SOURCE 700
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <termios.h>
#include <time.h>
int getkey() {
int character;
struct termios orig_term_attr;
struct termios new_term_attr;
/* set the terminal to raw mode */
tcgetattr(fileno(stdin), &orig_term_attr);
memcpy(&new_term_attr, &orig_term_attr, sizeof(struct termios));
new_term_attr.c_lflag &= ~(ECHO|ICANON);
new_term_attr.c_cc[VTIME] = 0;
new_term_attr.c_cc[VMIN] = 0;
tcsetattr(fileno(stdin), TCSANOW, &new_term_attr);
/* read a character from the stdin stream without blocking */
/* returns EOF (-1) if no character is available */
character = fgetc(stdin);
/* restore the original terminal attributes */
tcsetattr(fileno(stdin), TCSANOW, &orig_term_attr);
return character;
}
int main()
{
int key;
/* initialize the random number generator */
srand(time(NULL));
for (;;) {
key = getkey();
/* terminate loop on ESC (0x1B) or Ctrl-D (0x04) on STDIN */
if (key == 0x1B || key == 0x04) {
break;
}
else {
/* print random ASCII character between 0x20 - 0x7F */
key = (rand() % 0x7F);
printf("%c", ((key < 0x20) ? (key + 0x20) : key));
}
}
return 0;
}
Not: Bu kod basitlik için hata kontrolü atlar.
Bu işe yarıyor gibi görünüyor, ancak aynı zamanda her zaman tüm arabelleği sağlamak gibi görünüyor. Yani b sonra b sonra b basın b basın bastıktan sonra aababc – Jackie
@Jackie görüntüler bir "while (getchar()! = EOF);" sonra karakter = fgetc (stdin); ' –
- 1. .NET'te tuşa basılan tuş basmayı nasıl bastırırım?
- 2. Tuşa basılan tuşlar arasındaki sürenin nasıl hesaplanacağı
- 3. asp.net: onclick düğmesine basılan parametre için çift kanallar nasıl kullanılır?
- 4. , nasıl bir tuş kombinasyonu
- 5. linux içinde awesomium sdk nasıl kullanılır
- 6. Windows konsolunda yinelemeli olarak "svn add" nasıl kullanılır?
- 7. APNs Auth Key .p8 sertifikasını Firebase konsolunda nasıl kullanılır
- 8. Ekran noktasını Windows ve Linux konsolunda ekranın üstüne sıfırla
- 9. tuş?
- 10. iphone'da basılan Klavye tuşu nasıl algılanır?
- 11. mongodb konsolunda nasıl temizlenir
- 12. Linux terminal uygulamalarında tuşa basma ve tuş bırakma olaylarını alma?
- 13. Linux: Paylaşılan bir kütüphaneye bağlanırken .pc dosyaları nasıl kullanılır?
- 14. Bir TextBox'ta backspace tuş darbesi nasıl önlenir?
- 15. Tuş vuruşu
- 16. Tuş kilidinde
- 17. Basit Emacs tuş atamaları
- 18. Tutamaç Klavyesi Ione'da basılan etkinlik Iphone
- 19. Farklı Linux dağıtımlarında farklı başlık dosyalarının konumu nasıl kullanılır?
- 20. nasıl Linux
- 21. nasıl linux
- 22. Linux bir dosyayı nasıl yürütür?
- 23. Son basılan satırın üzerindeki Python çıkışı
- 24. (tuşa basma) angular2'den basılan anahtarı alın
- 25. mono: Linux
- 26. Bash - linux
- 27. Bir Linux/CentOS PC'deki php.ini dosyası nerede?
- 28. xmonad'da bir tuş serbest bırakıldığında gerçekleşecek bir eylemi nasıl ayarlayabilirim?
- 29. Java konsolunda renkler
- 30. RStudio konsolunda kiril gösteriliyor
benzer ve/veya benzer - [C bloke olmayan klavye girişi] (http://stackoverflow.com/q/448944/203667) – jschmier