Аналог kbhit в linux

Обновлено: 07.07.2024

В Windows у меня есть следующий код для поиска ввода без прерывания цикла:

Однако, видя, что нет conio.h , какой самый простой способ добиться этого в Linux?

спросил(а) 2015-03-30T01:36:00+03:00 6 лет, 7 месяцев назад

Процитированные выше упоминания могут быть полезными. Вот пример, иллюстрирующий использование ncurses как пример conio:

Обратите внимание, что с ncurses заголовок iostream не используется. Это связано с тем, что смешение stdio с ncurses может иметь неожиданные результаты.

ncurses, между прочим, определяет TRUE и FALSE . Правильно настроенные ncurses будут использовать тот же тип данных для bool ncurses, что и компилятор C++, используемый для настройки ncurses.

ответил(а) 2015-03-30T02:07:00+03:00 6 лет, 7 месяцев назад

Если ваш linux не имеет conio.h который поддерживает kbhit() вы можете посмотреть здесь код Morgan Mattews, чтобы обеспечить функциональность kbhit() совместимую с любой совместимой с POSIX системой.

Поскольку трюк дезактивирует буферизацию на уровне termios, он также должен решить проблему getchar() как показано здесь.

ответил(а) 2015-03-30T01:40:00+03:00 6 лет, 7 месяцев назад

Компактное решение, основанное на Кристофе,

В отличие от этого ответа, это не покинет терминал в странном состоянии после выхода программы. Тем не менее, он по-прежнему оставляет символы, сидящие во входном буфере, поэтому нажатый ключ будет неприглядно отображаться в следующей строке подсказки.

Другое решение, которое устраняет эту проблему, - это

Использование выглядит следующим образом

Теперь любые символы, набранные между выполнением первой и последней строк, не будут отображаться в терминале. Однако, если вы выходите с Ctrl + C, терминал остается в странном состоянии. (Вздох)

ответил(а) 2017-07-13T00:11:00+03:00 4 года, 4 месяца назад

Хотя использование ncurses функционально эквивалентно API Turbo C "conio.h", более полным решением является использование реализации conio, как можно найти здесь.

Вы загружаете и используете его в своей программе для очень полной реализации интерфейса conio в Linux. (Или OSX.) Написал Рон Берки.

В Windows у меня есть следующий код для поиска ввода без прерывания цикла:

Однако, учитывая отсутствие conio.h , каков самый простой способ добиться того же самого в Linux?

Приведенные выше ncurses howto могут быть полезны. Вот пример, показывающий, как можно использовать ncurses, как пример conio:

Обратите внимание, что с ncurses заголовок iostream не используется. Это потому, что смешивание stdio с ncurses может иметь неожиданные результаты.

Ncurses, между прочим, определяет TRUE и FALSE . Правильно настроенный ncurses будет использовать тот же тип данных для ncurses ' bool , что и компилятор C ++, используемый для настройки ncurses.

Если вы используете Linux, я нашел это решение, в котором вы можете создать свою собственную локальную библиотеку:

Внутри main.cpp я создал экземпляр:

Хотя использование ncurses функционально эквивалентно API Turbo C "conio.h", более полным решением является использование реализации conio, например найдено здесь.

Вы загружаете и используете его в своей программе для очень полной реализации интерфейса conio в Linux. (Или OSX.) Написал Рон Бёрки.

Компактное решение, основанное на ответе Кристофа:

В отличие от этого ответа, это не оставит терминал в странном состоянии после выхода из программы. Однако при этом символы остаются во входном буфере, поэтому нажатая клавиша нежелательно появится в следующей строке приглашения.

Другое решение, которое устраняет эту проблему, -

Использование выглядит следующим образом

Теперь символы, введенные между выполнением первой и последней строк, не будут отображаться в терминале. Однако, если вы выйдете с помощью Ctrl + C, терминал останется в странном состоянии. (Вздох)

Если в вашем Linux нет conio.h , который поддерживает kbhit() , вы можете найти здесь, чтобы Код Morgan Mattews, обеспечивающий функциональность kbhit() , совместимую с любой POSIX-совместимой системой.

Поскольку уловка деактивирует буферизацию на уровне termios, она также должна решить проблему getchar() , как продемонстрировано здесь.

Основы программирования в Linux

Нейл Мэтью (Neil Matthew) интересуется компьютерами и пишет для них программы с 1974 г. Выпускник университета г. Ноттингема по специальности "Математика", Нейл по-настоящему увлекается языками программирования и любит искать новые пути решения компьютерных проблем. Им разработаны системы программирования на языках BCPL, FP (Functional programming), Lisp, Prolog и структурированном BASIC. Он даже написал эмулятор микропроцессора 6502 для выполнения в системах UNIX программ для микрокомпьютера ВВС.

Что касается опыта работы в UNIX, начиная с конца 1970 гг., Нейл испробовал все варианты, включая BSD UNIX, AT&T System V, Sun Solaris, IBM AIX, многие другие и, конечно, Linux. Он может утверждать, что занимается ОС Linux с августа 1993 г., когда обзавелся дистрибутивом из Канады Software Landing (SLS) на дискетах с версией ядра 0.99.11. Он применял компьютеры на базе Linux дома и на работе для осваивания языков С, С++, Icon, Prolog, Tcl и Java.

Все "домашние" проекты Нейла разработаны на базе Linux. Он утверждает, что Linux гораздо проще, поскольку поддерживает множество функциональных возможностей других систем, поэтому программы, предназначенные для систем BSD и System V, как правило, компилируются с небольшими изменениями или вообще без каких-либо изменений.

Сейчас Нейл работает в компании Celesio AG как архитектор ПО компании (Enterprise Architect), специализирующийся на разработке стратегии информационных технологий. У него есть профессиональный опыт технического консультирования, разработки программного обеспечения и контроля качества. Нейл также писал программы на языках С и С++ для встроенных систем реального времени.

Нейл женат на Кристине, у них двое детей, Александра и Адриан. Он живет в перестроенном амбаре (barn) в графстве Нортгемптоншир в Англии. К его любимым занятиям относятся решение головоломок на компьютере, музыка, научная фантастика, сквош и горный велосипед, только не подражайте ему в этом последнем.

Ричард Стоунс (Richard Stones) начал программировать в школе (раньше, чем он может вспомнить) на микрокомпьютере ВВС, оснащенном микропроцессором 6502, который с помощью нескольких запчастей продолжал функционировать следующие 15 лет. Он закончил университет г. Ноттингема по специальности "Электроника", но решил, что программное обеспечение увлекательнее.

Он работал в разных компаниях, начиная от очень маленьких с десятком сотрудников и заканчивая очень большой, включая гиганта IT-сервисов, компанию EDS.

В эти годы он занимался рядом проектов, будь то коммуникации в режиме реального времени для систем бухгалтерского учета или большие справочные настольные системы. В настоящее время Рик работает архитектором информационных технологий, действуя как технический руководитель разных крупных проектов в большой панъевропейской компании.

Будучи отчасти лингвистом в программировании он писал программы на разных ассемблерах, на чистом, патентованном языке телекоммуникаций, названном SL-1, нескольких диалектах языка FORTRAN, языках Pascal, Perl, SQL и чуть-чуть на Python, С++ и С. (Под давлением он даже признался, что одно время считался не без оснований специалистом в Visual Basic, но старается не афишировать это временное помрачение рассудка.)

Рик живет в деревне графства Лестершир в Англии с женой Анной, детьми Дженнифер и Эндрю и кошкой. В свободное от работы время он увлекается классической музыкой, особенно старинной духовной музыкой, и фотографией и прилагает максимум усилий, чтобы найти время для игры на пианино.

Авторы хотели бы поблагодарить многих людей, помогавших сделать возможным издание книги.

Нейл хотел бы поблагодарить свою жену Кристину за понимание и своих детей Александру и Адриана, не слишком жаловавшихся на то, что отец проводит так много времени в своем кабинете, занимаясь писательством.

Рик благодарен своей жене Анне и своим детям, Дженнифер и Эндрю за их долготерпение по вечерам и в выходные дни, когда отец опять и опять принимался за работу над книгой.

Мы хотели бы выразить признательность сотрудникам издательства Wiley, которые помогли подготовить это четвертое издание к печати. Спасибо Кэрол Лонг (Carol Long) за запуск этого процесса и улаживание проблем, связанных с контрактами, особая благодарность Cape Шлаер (Sara Shlaer) за исключительную редакторскую работу и Тимоти Борончику (Timothy Boronczyk) за отличные технические рецензии, Мы также хотим поблагодарить Дженни Ватсон (Jenny Watson) за поиск средств для оплаты неожиданно возникавших дополнительных расходов и сопровождение книги на всех административных уровнях, Биллу Бартону (Bill Barton) за обеспечение надлежащих организации и презентации и Киму Коферу (Kim Cofer) за тщательную корректуру. Мы также очень признательны Эрику Фостеру-Джонсону (Eric Foster-Johnson) за его фантастическую работу над главами 16 и 17. Мы можем сказать, что благодаря стараниям всех вас книга стала лучше.

Мы также хотели бы поблагодарить наших работодателей, компании Scientific Generics, Mobicom и Celesio за поддержку во время подготовки всех четырех изданий книги.

В заключение нам хотелось бы выразить глубокую признательность двум важнейшим инициаторам, сделавшим возможным появление книги. Во-первых, Ричарду Столлмену (Richard Stallman) за отличные средства проекта GNU и идею среды со свободно распространяемым программным обеспечением, ставшей в наши дни реальностью благодаря GNU/Linux, и во-вторых, Линусу Торвальдсу (Linus Torvalds) за начатую и продолженную им совместную разработку, которая дает нам все улучшающееся ядро системы Linux.

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

Данное издание книги было проверено и исправлено в соответствии с современным уровнем разработок в ОС Linux.

Рады предложить вам легкое в использовании руководство по разработке программ для Linux и других UNIX-подобных операционных систем.

В этой книге мы стремимся дать вам представление о разнообразных понятиях, важных для разработчика, применяющего систему Linux, так сказать, основы. Слово "основы" скорее относится к ее содержимому, чем к уровню подготовки читателя. Мы построили книгу так, чтобы, несмотря на уже приобретенный вами опыт, вы узнали больше о том, что может предложить Linux. Программирование в ОС Linux — обширная область, и мы стараемся представить достаточно сведений, касающихся различных тем, чтобы дать вам прочные "основы" для усвоения каждой из них.

Версии Linux

Иерархическая структура каталогов Linux

Иерархическая структура каталогов Linux – все сводится к корню «/» (root).

Иерархическая структура каталогов Linux

Иерархическая структура каталогов Linux

/ Корневой каталог, содержит всю файловую архитектуру.
/bin Основные утилиты, необходимые как в однопользовательском режиме, так и при обычной работе всем пользователям (например: cat, ls, cp).
/boot Загрузочные файлы (в том числе файлы загрузчика, ядро, initrd).
/dev Основные файлы устройств (например, /dev/null, /dev/zero).
/etc Общесистемные конфигурационные файлы.
/home Домашние каталоги пользователей, которые содержат персональные настройки и данные пользователя.
/lib Основные библиотеки, необходимы для работы программ из /bin и /sbin.
/media Точки монтирования для сменных носителей.
/mnt Временно монтируемые файловые системы.
/opt Дополнительное программное обеспечение.
/proc Виртуальная файловая система, состояние ядра ОС и запущенные процессы в виде файлов.
/root Домашний каталог супер пользователя.
/run Информация о системе с момента ее загрузки, в том числе данные, необходимые для работы демонов.
/sbin Основные системные программы для администрирования и настройки системы, например init, iptables, ifconfig.
/srv Данные для сервисов, предоставляемых системой (например, www или ftp).
/sys Информация об устройствах, драйверах, а также некоторых свойств ядра.
/tmp Временные файлы.
/usr Вторичная иерархия для данных пользователя. Содержит большинство пользовательских приложений и утилит, используемых в многопользовательском режиме.
/var Изменяемые файлы, такие как файлы регистрации, временные почтовые файлы, файлы спулеров, лог файлы.

Варианты установки ПО в Linux

Из исходных кодов – компиляция бинарных файлов, возможность модифицировать, возможность установки без прав администратора.
Минусы: Поиск зависимостей очень долгий. Отсутствие контроля установленного ПО.

Из пакетов – пакет, это своего рода архив, который содержит уже готовый скомпилированный бинарный файл и перечень зависимостей (сразу виден перечень зависимостей). Есть контроль установленного ПО.

Пакетные менеджеры обрабатываю пакеты, имеют собственную базу данных установленного ПО. Если все таки ПО идет из исходного кода, тогда правильно будет собрать пакет и установить.
Минусы: Нужны права администратора. Пакеты создаются под определённый дистрибутив Linux (rpm для пакетного менеджера yum и deb для dpkg).

Из репозитория – место где хранятся и поддерживаются какие-либо данные. Чаще всего данные в репозитории хранятся в виде файлов, доступных для дальнейшего распространения по сети. Сразу виден перечень зависимостей, есть контроль установленного ПО и как правило все зависимости автоматически устанавливаются из репозитория. Он может быть расположен локально, либо в локальной сети, либо на официальных сайтах.

Простейшие команды в Linux

ls -l Просмотр файлов и директорий, -a показать скрытые файлы.
pwd Текущая директория.
touch Создание файлов
mkdir Создание директорий, -p авто создание поддиректорий.
cd Сменить текущую директорию. Абсолютный путь – путь от корня файловой системы. Относительный путь – путь из текущей директории.
rm Цдалить файл, можно использовать маску.
rmdir Удалить директорию, удаляет только пустые. Нужно использовать команду rm –r, а после rmdir.
cp Копирование файлов и директорий.
mv Перемещение файлов и директорий, можно использовать для переименования.
type Информация о типе команды, то как она будет интерпретироваться если вводится в командной строке.
whereis Показывает полный путь к исполняемому файлу.
who Кто сейчас работает на сервере.
man Справочная информация по команде.
more Листать файл, пробел постранично, еnter построчно, выход клавиша Q.
less Листать файл, можно с помощью курсора, поиск по файлу.

Пользователи в Linux

  • root (UID 0) – никаких ограничений.
  • Все остальные – служебные (демоны) и обычные (UID не 0).

/etc/passwd – хранится информация о пользователях, в виде:
имя пользователя : Х : UID : GUID (UID группы) : комментарий : домашний каталог : командная оболочка

/etc/group – информация о группах пользователей.
имя группы : GUID : кто входит в группу

/etc/shadow – информация о паролях пользователей, в виде хэш.

Расширение файла не имеет значения для ОС – файл это всего лишь поток байт.

File permissions

Права доступа к файлам

Права доступа к файлам

Директория – это файл с определенным признаком каталога.
x – открыть директорию.
r – прочесть содержимое директории.

chmod – смена прав. Ключ –R меняет права директории и содержимого.

Команда chmod

stat – выводит информацию inode файла.

df – свободное пространство файловых систем.
df –i – информация о inode.

Hard Link – синоним имени файлов – для создания ln, для просмотра ln –li, так как при выводе inode можно увидеть количество жестких ссылок. Жесткие линки созданные на один файл, логически между собой равны. Нельзя создавать на каталоги и только в пределах одной файловой системы, потому что inode уникальны в рамках одной файловой система.

Soft Link – аналог ярлыков, ln –s.
Софт линк занимает inode так как это новый файл, а хард линк – новое имя уже существующего файла. Можно создавать на каталоги и между разными файловыми системами.

Работа с потоками STDIN, STDOUT, STDERR

Потоки STDIN, STDOUT, STDERR

Потоки STDIN, STDOUT, STDERR

Команда tee::

Монтирование

  • Уровень абстракции поверх конкретной реализации файловой системы.
  • Обеспечивает единообразный доступ клиентских приложений к различным типам файловых систем.
  • Программный интерфейс между ядром и драйвером конкретной файловой системой.

Установка ПО

Список файлов в пакете:

Поиск пакета по файлу:

Процессы в Linux

Процесс – программа выполняющаяся в текущий момент, совокупность файлов и данных.

Создать процесс можно исключительно из существующего процесса.
fork() – системный вызов, создающий новый процесс. Создает полную копию процесса. Стартует в одном процессе, завершается в двух.
exec() – системный вызов, заменяющий исполняемый код в процессе. Загрузили программу в созданный процесс.
exit() – завершение процесса. Возвращает код возврата.
wait() – считывает код возврата. Вызывается из процесса, который сделал вызов fork(). Считать код возврата может только тот процесс, из которого произошел процесс, который сейчас завершился, то есть процесс родитель.

fork-exec-exit-wait

fork exec exit wait

PID – Уникальный идентификатор процесса, PPID – уникальный идентификатор процесс родителя. Все процессы имеют идентификаторы кроме init или systemd (pid 1 и ppid 0) и kthreadd (pid 2 и ppid 0).

init – пространство пользователя.
kthreadd – процесс пространства ядра.

A tree of processes on a typical Linux system

Иерархическая структура процессов.

Процесс зомби – процесс между событиями exit и wait от родителя. Нормальное состояние, но если они начинают плодится стоит задуматься. Так как могут быть лимит у пользователя.
1. Симптом загруженной системы.
2. Процесс не следить за своими потомками, код возврата читает исключительно родитель.

Процесс сирота – это процесс без родителя. За сиротами следит ядро, как только появляется такой процесс он присваивается init, чтобы можно было прочесть код возврата.

Как завершить процесс-зомби, сделать сиротой, тогда он присвоится init и завершится.

Сигналы обрабатываются специальными обработчиками – описание того что произойдет. Можем сами написать, произойдет замена на дефолтный. На 9 сигнал невозможно написать обработчик. Исключения процессы в статусе d (dump) и процесс init (В FreeBSD можно убить init).

top – показывает первые процессы которые потребляют больше всего процессорного времени.
Если нажать S можно установить период обновления.

top_load_average

Загрузка компьютера: За 1 минуту, За 5 минут, за 15 минут.

load average – среднее количество процессов в очереди на ожидании ресурсов. Если за минуту больше чем за 5 минут, значит нагрузка возрастает, если наоборот, нагрузка падает. Должно быть меньше или равно количеству ядер процессора, но не всегда.

В Линкус в очередь могут попадать процессы ожидающие каких то данных с устройства ввода-вывода, например при монтированная папка которая не доступна по сети, процесс приобретает статус di. По сути это не страшно, так как процессор не нагружают.

Если нажать 1 можно увидеть данные по ядрам.
Вторая строчка – сколько процессов и какой у них статус.

top_cpu_tasks

us – сколько процессорных ресурсов израсходовано в пространстве пользователя.
sy – сколько процессорного потрачено на работу ядра.
ni (nice) – сколько процесс. ресурсов потраченных на процессы с низким приоритетом
id – процент простоя процессорного времени.
wa – сколько процессорного времени потраченного на устройство ввода-вывода. Если растет этот параметр, значить система ввода-вывод не справляется с текущей нагрузкой, либо сеть либо диск.
hi – сколько процессорных ресурсов потрачено на обработку аппаратных прерываний.
si – сколько процессорных ресурсов потрачено на программные прерывания.
st – как занята хостовая машина. Актуально для виртуальных машин. Не для всех гипервизоров актуально.

Узнать DNS: cat /etc/resolv.conf

Системы инициализации

Linux-Booting-process

Порядок загрузки компьютера:

Читайте также: