Я стараюсь изо всех сил создавать простые оболочки на Linux. Просто я могу создать, чтобы узнать, как использовать базовые системные вызовы.Работа с пользовательскими вводами на linux
Сценарий: пользователя в команде, прессы вкладка (так что оболочка автоматически завершает свою команду), то команда автоматического завершения выскакивает (или предложения), пользователь нажимает введите, команду Evals и выполняет ,
Как и в bash.
Я понял, как сделать оценки, преобразовать команду в токены, выполнить ее с помощью труб и прочее. То, что я не могу понять, - это входная часть. А именно эти нажатия клавиш.
Я знаю, какие варианты у меня есть:
getc()
- получить каждый символ отдельно, сохранить его в буфере. Невозможно понять, как получить нажатия клавиш нажатия клавиш, поскольку он приостанавливает выполнение, пока не увидит «\ n» или Ctrl + D. Kinda дорого, так как для каждого символа команды будет 1 getc(). Кроме того, мне придется иметь дело с перераспределением буфера, амортизацией ... boo ...scanf("%s")
- слишком много беспокоиться о переполнении буфера. Не могу получить эти нажатия клавиш, которые я не сделал. Приостанавливает выполнениеread()
(from unistd.h) - может быть, я не хочу. Но я видел людей здесь, которые говорили, что это настоящая боль, чтобы использовать его для этого. Я проверил. Это.getline()
- не удается получить нажатия клавиш.
Я изучил исходный код bash, чтобы узнать, как он работает с вводом, и OH MY GOD. Есть 450 строк кода, посвященных этой простой вещи (файл input.c).
Действительно ли нет более простых решений, чем это? Я не хочу использовать ncurses, я не забочусь о переносимости, я просто не достиг одной цели: получить пользовательский ввод и знать, когда он нажал клавишу табуляции. Делайте это элегантно, с минимальными усилиями.
'if (fgetc (stdin) == '\ t') {// запуск}' –
@self: приостанавливает выполнение. «Запуск» выполняется только после нажатия клавиши ввода. Мне нужно получить этот символ, прежде чем я нажимаю enter, поэтому я могу выполнить автозаполнение для того, что уже было записано в поток ввода. –
использовать его в цикле 'for (;;)', как только вы получите '\ t', просто отбросьте все остальные входные данные –