Letysite.ru

IT Новости с интернет пространства
0 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

Getch c linux

Что такое эквивалент getch() & getche() в Linux?

Я не могу найти эквивалентный файл заголовка для conio.h в Linux.

Есть ли какой-либо вариант для функции getch() & getche() в Linux?

Я хочу сделать переключатель case base меню, где пользователь даст свой вариант, просто нажав одну клавишу & процесс должен быть перемещен вперед. Я не хочу, чтобы пользователь нажимал ENTER после нажатия его выбора.

7 Ответов

Просто скопируйте эти функции и используйте их. Я нашел этот фрагмент в google задолго до этого, и я сохранил его, наконец, я открыл его после долгого времени для вас!Надеюсь, это поможет! Спасибо

скопируйте эту функцию и используйте ее, не забудьте включить

remove the last printf if you dont want the char to be displayed

Я предлагаю вам использовать curses.h или ncurses.h эти реализующие процедуры управления клавиатурой, включая getch(). У вас есть несколько вариантов, чтобы изменить поведение getch (т. е. ждать нажатия клавиши или нет).

В библиотеке ncurses есть функция getch(). Вы можете получить его, установив пакет ncurses-dev.

Вы можете использовать библиотеку curses.h в linux, как указано в другом ответе.

Вы можете установить его в Ubuntu с помощью:

sudo apt-получить обновление

sudo apt-get install ncurses-dev

Я взял на себя часть установки отсюда .

Как было сказано выше, getch() находится в библиотеке ncurses . ncurses должен быть инициализирован, см. т. е. getchar() возвращает одно и то же значение (27) для клавиш со стрелками вверх и вниз для этого

Замена getch() на getchar() объявлена в stdio.h . getchar() доступно на Windows и Linux.

Ниже приводится комментарий от Макса Трукса .

Есть некоторые (несколько важные) различия между getch() и getchar() .

1) getch() возвращается сразу же после нажатия клавиши. getchar() позволяет вводить текст бесконечно, пока вы не введете EOL. 2) getch() ничего не выводит на экран. getchar() записывает все, что вы вводите на экран (даже EOL).

Если эти два различия не важны для пользователя, можно действительно использовать getchar() в качестве замены, иначе это может быть не самая лучшая идея.

Похожие вопросы:

Что такое эквивалент linux API для WaitForMultipleObjects() и WSAEnumNetworkEvents()? Можем ли мы использовать pthread_cond_wait() для WaitForMultipleObjects?

Есть ли эквивалент для C’s getch() в Android или Java? Я хочу, чтобы выполнение остановилось, пока пользователь не сделает какое-то действие, например, не нажмет на экран или, возможно, не нажмет.

Я использую Visual studio для разработки кода и когда я использовал функцию getche() Компилятор дал мне это предупреждение warning C4013: ‘getche’ undefined; assuming extern returning int Но функция.

Ранее я использовал компиляторы c++/c на windows, которые поддерживают заголовочный файл #include , но на linux, где у меня есть gcc (Debian 4.9.2-10) 4.9.2 Copyright (C) 2014 Free.

Что такое эквивалент ZSH compadd в linux bash? Что я должен использовать вместо этого? Спасибо

Что такое эквивалент ldd Linux на windows?

Что такое Linux или POSIX эквивалент VirtualAlloc с MEM_TOP_DOWN, если они есть?

Я установил библиотеку ncurses в Linux mint и до сих пор не могу использовать функцию getch в c . Я использую Linux mint 18.2. Вот моя программа: #include #include .

Читать еще:  Ssh ключ linux

Мне нужна помощь в использовании getche . Проблема в том, что я хочу использовать int , а на этом int я хочу использовать getche , но например если бы я это сделал: int choice1 = 0; choice1 =.

Я очень новичок в разработке C++ в Linux, поскольку я всегда использовал Visual Studio в Windows для разработки. Существует проект C++, проект был разработан таким образом, что он строится с.

C programming для начинающих: часть 15 — проблемы gets() и fgets()

В предыдщуем примере мы уже сталкивались с использованием функции gets() :

Тут мы получаем данные от пользователя из STDIN , и вписываем их в массив agestring .

Однако — тут имеется серьёзная проблема: gets() примет любое количество символов, которые введёт пользователь программы, несмотря на то, что сам массив объявлен длиной в 10 символов:

Что произойдёт, если ввести большее их количество?

Давайте рассмотрим это на следующей программе:

Обратите внимание на предупреждение:

warning: the `gets’ function is dangerous and should not be used.

Сейчас мы увидим — почему оно появляется.

В программе выше мы повторяем те же действия — создаём два массива с длиной в 5 элементов:

После чего в функции getinput_with_gets() мы используем gets() для получения данных от пользователя.

В данном случае — у нас всё сработает как положено если мы введём 4 символа (5-ый — null-терминатор, символ завершения строки, ):

Но если вы введёте большее количество — то gets() примет всю строку ввода, начнёт вносить данные в массив, и т.к. длина массива будет меньше, чем строка — то эта строка выйдет за пределы массива, в другой, непредсказуемый, участок памяти, что может привести к тому что эта строка перезапишет данные, уже имеющиеся в этом участке памяти.

Можно продемонстрировать происходящее так: в getinput_with_gets() добавим цикл, который будет выводить все элементы массива и их индексы:

Тут хорошо видно, что gets() просто начал перезаписывать массив сначала: вместо 1 в первом (нулевом) элементе мы получаем последний символ — 6.

Решение этой проблемы — использовать альтернативную функцию fgets() вместо gets() , что сделано в функции getinput_with_fgets() нашего примера выше:

Обновим main() , меняем используемую функцию:

В отличии от gets() — fgets() принимает три аргумента:

Первым указывается имя массива, в который мы будем вносить данные, вторым — максимальное количество символов, которые fgets() примет на входе. Третьим указывается источник данных, в данном случае — обычный STDIN .

Итак — второй аргумент указывает fgets() принять только указанное кол-во символов -1 (завершение строки).

Таким образом, если вы укажете вторым аргументом строку «abcde» — только первые 4 символа abcd будут внесены в массив firstname + последний символ . Следовательно — firstname будет одержать строку «acbd«.

Казалось бы — всё работает, как и ожидается. Но давайте внимательнее рассмотрим код:

Обратите внимание на функцию flush_input() :

Зачем она нужна? Давайте закомментируем её вызов, и проверим:

Упс… Наша программа теперь даже не вызывает fgets(lastname, 5, stdin) , и вместо этого срабатывает printf() сразу же после fgets(firstname, 5, stdin) , при этом присваивая «остаток» первой строки во второй массив lastname[] .

Читать еще:  Linux ubuntu server

Почему так происходит, для чего потребовалось явно создавать и вызывать функцию flush_input() — рассмотрим в следующей части.

Что такое команда sh -c?

Я обнаружил команду sh -c . Я нашел его, прежде чем я разместил здесь, но я не могу найти какие-либо сообщения от Google, которые его объясняют, поэтому я хотел бы знать, что это такое и какой его полный синтаксис.

3 ответа

sh вызывает программу sh в качестве интерпретатора, а флаг -c означает выполнение следующей команды, интерпретируемой этой программой.

В Ubuntu sh обычно символически ссылается на /bin/dash , а это означает, что если вы выполняете команду с sh -c , то для выполнения команды вместо bash будет использоваться служебная оболочка. Оболочка с именем sh зависит от символической ссылки — вы можете узнать с readlink -e $(which sh) . Вы должны использовать sh -c , если вы хотите выполнить команду специально с этой оболочкой вместо bash.

Вы можете использовать этот синтаксис (флаг -c ) с другими интерпретаторами. Одно из его классических применений (указано @edwinksl — обойти проблему перенаправления, не работающую с sudo (здесь вы можете использовать bash -c или sh -c )

напишет файл bar , содержащий текст foo , /home/ , а sudo echo «foo» > /home/bar не удалось , как объяснено здесь очень хорошо

Важно использовать «одинарные кавычки» вокруг командной строки, иначе текущая оболочка попытается развернуть ее до того, как она будет передана интерпретатору, который вы назвали

например (с помощью python, пока не подумаю о команде, которая даст разные результаты в тире . )

Прочитайте команды из операнда command_string, а не из стандартный ввод. Специальный параметр 0 будет установлен из имени command_name операнд и позиционные параметры ($ 1, $ 2 и т. д.), установленные из оставшиеся операнды аргументов.

Другие сведения о sh могут быть найдены при запуске:

Пример использования строки в качестве аргумента:

Это более подробный пример sh -c . Он загрузит документ с Google Диска и откроет его для редактирования на рабочем столе:

sh -c запускает сеанс non-login , неинтерактивный sh ( dash в Ubuntu).

После этого команда будет запущена в этом сеансе оболочки, она будет рассматриваться как аргумент (позиционный параметр) 0 ( ARGV0 ), а оставшаяся часть — как аргумент этой команды ( ARGV0 ), начиная с 1 ( ARGV1 , ARGV2 , . ).

Вы также можете использовать обычные функции оболочки, разрешенные для запуска в этом сеансе, например. разделение команд с использованием ; для использования нескольких команд, группировка команд с использованием <> , создание другой подоболочки с () и т. д. Их использование может слегка изменить приведенные ранее аргументы / примеры.

Просто отметим, что функции, характерные только для интерактивных оболочек (по умолчанию), например. расширение истории, source -ing

/.bashrc и /etc/bash.bashrc и т. д. не будут доступны в этом сеансе, так как это неинтерактивный . Вы можете имитировать поведение интерактивных сеансов (почти), используя параметр -i :

Аналогично, функции, характерные только для login оболочек (по умолчанию), например. source -ing

/.bash_login не существует), а /etc/profile не будет выполняться, поскольку оболочка является оболочкой non-login . Вы можете моделировать поведение логина-оболочки с помощью опции -l :

Читать еще:  Сервер виртуализации на linux

Чтобы имитировать как логин, так и интерактивные сеансы:

Ctrl + C, Ctrl + D, Ctrl + Z

Комбинации клавиш Ctrl + C, Ctrl + D и Ctrl + Z часто используются в терминале для выхода из программы, работающей на переднем плане (foreground), и передачи управления Bash.

Ctrl + C выполняет прерывание процесса. По-сути убивает его. Результат действия Ctrl + D такой же. Однако разница между этими двумя способами выхода есть, и заключается она во внутреннем механизме.

Нажатие Ctrl + C заставляет терминал послать сигнал SIGINT процессу, который на данный момент его контролирует. Когда foreground-программа получает сигнал SIGINT, она обязана прервать свою работу.

Нажатие Ctrl + D говорит терминалу, что надо зарегистрировать так называемый EOF (end of file – конец файла), то есть поток ввода окончен. Bash интерпретирует это как желание выйти из программы.

При работе в конкретной программе могут срабатывать оба способа, но может только один. Так команда cat без параметров запускается в интерактивном режиме, в котором то, что вы ввели, будет тут же выводиться на экран после нажатия Enter. Выйти из программы можно как с помощью Ctrl + С, так и Ctrl + D.

Выйти из интерпретатора Питона с помощью Ctrl + C нельзя.

Комбинация клавиш Ctrl + Z посылает процессу сигнал, который приказывает ему остановиться. Это значит, что процесс остается в системе, но как бы замораживается. Само собой разумеется он уходит в бэкграунд (background) – в фоновый режим. С помощью команды bg его можно снова запустить, оставив при этом в фоновом режиме. Команда fg не только возобновляет ранее приостановленный процесс, но и выводит его из фона на передний план.

На скриншоте сначала запускается интерпретатор Питона. Далее его работа останавливается с помощью Ctrl + Z. Командой fg python3 мы возобновляем работу приложения и делаем его текущим. То, что мы вернулись в тот же самый процесс, видно по переменной a , значение которой остается доступным.

С помощью команды ps можно посмотреть процессы текущего сеанса Bash (используя ключи можно просматривать и другие процессы). А команда kill позволяет удалять ненужные.

Здесь запускается cat и приостанавливается. Далее смотрим список процессов. Ключ -9 команды kill обозначает, что мы хотим полностью избавиться от процесса. В качестве аргумента передается идентификационный номер процесса (PID).

Отметим, что во многих консольных программах управляющие комбинации с клавишей Ctrl обычно обозначаются как ^C, ^Z и т. п. То есть вместо Ctrl используется знак ^.

Если в текущем терминале было запущено и переведено в фон несколько одноименных процессов, то сделать один из них текущим с помощью команды fg имя_программы не получится. PID также не используется как аргумент для fg. Здесь используется идентификатор процесса, который возвращает команда jobs. Причем для fg его надо использовать в формате %ID.

Выполните команды sleep 10m и sleep 10s , каждую остановите с помощью Ctrl + Z. Посмотрите идентификаторы процессов с помощью jobs. Выведите из бэкграунда десятисекундный слип. Учитывалось ли время, когда процесс был остановлен? После этого сделайте текущим десятиминутный слип и прервите его.

Курс с ответами к заданиям и дополнительными уроками:
android-приложение, pdf-версия.

Ссылка на основную публикацию
Adblock
detector