π 곡λΆνλ μ§μ§μνμΉ΄λ μ²μμ΄μ§?
[νμΌ μ²λ¦¬μ νμ€μ μΆλ ₯] ν°λ―Έλ μ μ΄λ‘ νλ©΄ νΈμΆνκΈ° tcgetattr & fcsetattr λ³Έλ¬Έ
[νμΌ μ²λ¦¬μ νμ€μ μΆλ ₯] ν°λ―Έλ μ μ΄λ‘ νλ©΄ νΈμΆνκΈ° tcgetattr & fcsetattr
μ§μ§μνμΉ΄ 2024. 1. 4. 20:24<μμμ§ λμ μ¬λ¬ΌμΈν°λ·μ μν 리λ μ€ νλ‘κ·Έλλ° with λΌμ¦λ² 리νμ΄ μμ μ μ°Έκ³ ν΄μ μμ±νμμ΅λλ€ :-)>
β ν°λ―Έλμ κΈ°λ³Έ μ μ΄
kbhit() ν¨μλ ν€λ³΄λμ μ λ ₯μ κ°μ§νλ ν¨μ (μ λμ€μμ fcntl() ν¨μμ ν°λ―Έλ μ μ΄λ‘ ꡬν κ°λ₯)
ν°λ―Έλμ λ‘컬μ΄λ λ€νΈμν¬λ₯Ό ν΅ν΄μ μ격μΌλ‘ μ°κ²°λμ΄ μ λμ€ μμ€ν κ³Όμ λνλ₯Ό μν΄ μ¬μ©λλ λλ°μ΄μ€λ‘ /dev/tty λλ°μ΄μ€ νμΌ μ¬μ©ν¨
ν°λ―Έλμ κΈ°λ³Έ μ μ΄λ termios ꡬ쑰체μ κ΄λ ¨ ν¨μλ€μ μ¬μ©ν¨
(νλ©΄μ μΆλ ₯ν μ μλλ‘ ν°λ―Έλ μ μ΄ ν¨μμΈ tcgetattr, tcsetattr μ΄μ©ν΄μ ν°λ―Έλμ λν κ°μ κ°μ Έμ€κ±°λ μ€μ ν¨)
// kbhit() ν¨μλ ν€λ³΄λμ μ
λ ₯μ κ°μ§νλ ν¨μ (μ λμ€μμ fcntl() ν¨μμ ν°λ―Έλ μ μ΄λ‘ ꡬν κ°λ₯)
// ν°λ―Έλμ λ‘컬μ΄λ λ€νΈμν¬λ₯Ό ν΅ν΄μ μ격μΌλ‘ μ°κ²°λμ΄ μ λμ€ μμ€ν
κ³Όμ λνλ₯Ό μν΄ μ¬μ©λλ λλ°μ΄μ€λ‘ /dev/tty λλ°μ΄μ€ νμΌ μ¬μ©ν¨
// ν°λ―Έλμ κΈ°λ³Έ μ μ΄λ termios ꡬ쑰체μ κ΄λ ¨ ν¨μλ€μ μ¬μ©ν¨
// (νλ©΄μ μΆλ ₯ν μ μλλ‘ ν°λ―Έλ μ μ΄ ν¨μμΈ tcgetattr, tcsetattr μ΄μ©ν΄μ ν°λ―Έλμ λν κ°μ κ°μ Έμ€κ±°λ μ€μ ν¨)
#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
#include <termios.h>
int kbhit(void) {
// ν°λ―Έλμ λν ꡬ쑰체
struct termios oldt, newt;
int ch, oldf;
// νμ¬ ν°λ―Έλμ μ€μ λ μ 보 κ°μ Έμ΄
tcgetattr(0, &oldt);
newt = oldt;
// μ κ· λͺ¨λ μ
λ ₯κ³Ό μμ½λ₯Ό ν΄μ (ICANON μ κ·λͺ¨λλ‘ μ
λ ₯μ΄ μ΄λ€μ§κ² ν¨, ECHO λ ν€λ³΄λλ‘ μ
λ ₯ν λ΄μ©μ λͺ¨λν°λ‘ μΆλ ₯νλλ‘ ν¨)
newt.c_lflag &= ~(ICANON | ECHO);
// μλ‘μ΄ κ°μΌλ‘ ν°λ―Έλ μ€μ (TCSANOW λ°λ‘ ν°λ―Έλμ λ³κ²½λ μμ±μ΄ μ μ©λλλ‘ ν¨)
tcsetattr(0, TCSANOW, &newt);
oldf = fcntl(0, F_GETFL, 0);
// μ
λ ₯μ λ
ΌλΈλ‘νΉ λͺ¨λλ‘ μ€μ
fcntl(0, F_SETFL, oldf | O_NONBLOCK);
// getchar() : ν€λ³΄λλ‘ μ
λ ₯λ λ¬Έμκ° νλ©΄μ μλμΌλ‘ μΆλ ₯λ¨
ch = getchar();
if (ch != EOF) {
// μμμ μ½μΌλ©° κΊΌλΈ λ¬Έμλ₯Ό λ€μ λ£λλ€
ungetc(ch, stdin);
}
return 0;
}
int main(int argc, char **argv) {
for (int i = 0;; i++) {
if (kbhit()) {
switch(getchar()) {
case 'q':
goto END;
break;
};
}
// νμ¬ μΉ΄μ΄νΈν μ«μλ₯Ό μΆλ ₯
printf("%20d\t\t\r", i);
// 100λ°λ¦¬μ΄ λμ μ μ μ°λ€
usleep(1000);
}
END:
printf("Good Bye!\n");
return 0;
}
// => μ«μκ° μ μ리μμ μ¦κ°νλ€
// ν μ€μμλ§ μ«μμ μ¦κ°λ₯Ό νμνκΈ° μν΄ "\r" μ¬μ©ν¨
/*
gani@gani:~/raspi/File $ gcc -o hitkey hitkey.c
gani@gani:~/raspi/File $ ./hitkey
8580
*/
gcc -o hitkey hitkey.c
./hitkey
μ€μ. q λλ₯΄λ©΄
Good Byte κ° λμμΌλλλ°
μ q μΈμλ μλλκ±°μ₯¬~~? ν΄ν΄ν΄ν΄