2016-01-20 3 views
-2

Я пытаюсь распознать нажатый пользователем ключ. Я не остановлю программу, если пользователь нажимает клавишу «ВВЕРХ». Я делаю это для дальнейшей реализации истории команд. Этот код getKey() не является моей функцией, я нашел его здесь где-нибудь, должен ли он работать? Потому что всякий раз, когда я нажимаю клавишу «ВВЕРХ», ничего не происходит.Получить нажатый ключ в linux C

int getKey(){ 
int character; 
struct termios orig_term_attr; 
struct termios new_term_attr; 

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); 

character = fgetc(stdin); 

tcsetattr(fileno(stdin), TCSANOW, &orig_term_attr); 

return character; 
} 

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

char cmd[500]; 
int key; 

do{ 
    printf("$ > "); 
    fgets(cmd, 499, stdin); 
    trim(cmd); 
    key = getKey(); 

    if(key == 0x17C){ 
     break; 
    } 

    if(starts_with(cmd, "./")){ 
     execute_external_command(cmd); 
    }else{ 
     execute_internal_command(cmd); 
    } 


}while(strcmp(cmd, "exit") != 0); 

return 0; 
} 
+2

Почему вы не нашли время, чтобы понять, что делает функция и правильно ли она работает? Вам не интересно учиться? –

+0

Меня не интересует C, но у меня есть школьный проект, поэтому мне нужно это сделать. –

+3

Мне очень жаль вас, если вас не интересует самый красивый и мощный язык для всех. Это как не интересно изучать английский, если вы не являетесь носителем английского языка. –

ответ

1

Это сложно. Вы должны прочитать около tty -s, в частности TTY demystified. Понять роль ядра в line discipline.

Я предлагаю использовать GNU readline (она имеет историю и AutoCompletion функции!) Или GNU ncurses библиотеку (в противном случае, если запуск приложения с графическим интерфейсом под X11, код в Qt или GTK). В противном случае погрузитесь в книги (например, Advanced Linux Programming), объясняя детали tty (и его необработанные & приготовленные режимы) и см. termios(3) & poll(2) для начала.

+0

Поддерживает ли readline также нажатие клавиш? –

+0

Я не уверен, что вы имеете в виду, но я думаю, что да ... –

+0

@BasileStarynkevitch Я думаю, что GNU readline реализует историю, которую хочет OP. –

Смежные вопросы