программирование консольных приложений. Программирование консольных приложений Что из себя представляет консоль и зачем она нужна
Скачать 0.94 Mb.
|
«Программирование консольных приложений» Что из себя представляет консоль и зачем она нужна Консолью называется интерфейс, который используется приложением для ввода – вывода текстовой информации Пример работы простейшего консольного приложения Немного о структуре консоли: Консоль состоит из одного входного буфера и одного или нескольких буферов экрана. Входной буфер содержит информацию о событиях ввода. Буфер экрана содержит информацию для вывода в окно. Консоль обеспечивает два уровня ввода-вывода текстовой информации: высокий и низкий. Функции высокого уровня обеспечивают ввод-вывод символов с консоли, игнорируя остальные события. Функции низкого уровня обеспечивают обработку всех событий, связанных с консольным приложением. Входной буфер консоли: В входном буфере содержатся очередь записей, который описывают события ввода. Есть несколько событий ввода: Ввод с клавиатуры Ввод с мыши Изменение размеров окна Изменение фокуса ввода События связанные с меню Каждому событию ввода в очереди сообщений соответствует запись типа INPUT_RECORD Структура INPUT_RECORD Структура для записи для ввода с клавиатуры : Структура записи: dwControlKeyState содержит комбинацию флагов, которые описывают состояние управляющих клавиш. Эти флаги могут принимать следующие значения: Структура для записи для ввода с мыши : Структура записи: Флаги поля dwButtonState Флаги поля dwEventFlags Буфер обмена и буфер экрана: Буфер обмена – это место в оперативной памяти компьютера, предназначенное для промежуточного хранения любого вида информации Буфер экрана является двумерным массивом, элементы которого представляют собой записи типа: Работа с консолью: Процесс может быть связан только с одной консолью. Новая консоль может создаваться одним из следующих двух способов: При создании консольного процесса командой CreateProcess нужно установить флаг CREATE_NEW_CONSOLE Использование функции AllocConsole, которая имеет следующий прототип: BOOL AllocConsole(VOID); В обоих этих случаях заголовок окна консоли, его параметры, а также цвет фона и цвет текста задаются следующими полями структуры STARTUPINFO: Некоторые функции по работе с консолью: Освобождение консоли: BOOL FreeConsole(VOID); Чтение заголовка окна консоли: DWORD GetConsoleTitle(LPTSTR ipConsoleTitle, Dword nSize); Установка заголовка окна консоли: BOOL SetConsoleTitle(LPCTSTR ipConsoleTitle); Определение максимального размера окна: COORD GetLargestConsoleWindowSize(HANDLE hConsoleOutput); Установка координат окна: Установить окно консоли относительно буфера экрана можно вызовом функции SetConsoleWindowInfo : Для задания левого верхнего и правого нижнего углов окна используются поля структуры SMALL_RECT Ввод и вывод на консоль: К функциям ввода-вывода высокого уровня относятся следующие функции: WriteConsole , ReadConsole , WriteFile и ReadFile Для чтения строки символов из входного буфера консоли экрана используется функция ReadConsole Для записи строки символов в буфер экрана используется функция WriteConsole Командная строка в линукс: Когда в ответ на приглашение вводится команда, оболочка выполняет соответствующую этой команде программу. Например, когда вводится команда ls , оболочка выполняет служебную программу (утилиту) по имени ls Синтаксис командной строки: Синтаксис командной строки определяет порядок следования и разделения элементов командной строки. При нажатии клавиши ВВОД (после окончания набора команды) оболочка сканирует командную строку, проверяя в ней правильность использованного синтаксиса. Как правило, для командной строки используется следующий синтаксис: команда [арг1][арг2] … [аргn] ВВОД Элементы командной строки должны быть отделены друг от друга одним или несколькими пробелами. Команда — это имя команды, арг1–аргn — аргументы, а ВВОД — это клавиша, нажатие которой завершает ввод командной строки. Обработка командной строки: По мере ввода командной строки имеющийся в Linux драйвер устройства tty (входящий в ядро Linux) проверяет каждый символ, чтобы узнать, не нужно ли ему предпринять какие-либо немедленные действия. После нажатия комбинации клавиш CONTROL+H (для стирания символа) или CONTROL+U (для удаления всей строки) драйвер устройства тут же приводит командную строку в нужное состояние. Когда оболочка обрабатывает командную строку, она рассматривает ее целиком, а затем производит ее разбор (разбиение) на составные части Выполнение командной строки: Если оболочка найдёт исполняемый файл с таким же именем, как у введенной команды, она запустит новый процесс. Процесс — это выполнение команды системой Linux . Оболочка открывает вызываемой программе доступ ко всем аргументам командной строки, включая ключи и имя самой команды. В ходе выполнения команды оболочка ждет завершения процесса и находится в неактивном состоянии, называемом сном. Любые сообщения об ошибке или о порядке использования команды поступают из самой программы. Некоторые утилиты просто игнорируют неправильно указанные ключи. Поскольку оболочка не обрабатывает аргументы командной строки, а просто передает их вызываемой программе, у нее нет возможности узнать, подходит ли тот или иной ключ (или другой аргумент) данной программе. Стандартный ввод и стандартный вывод: Стандартный вывод — это место, куда программа может отправить информацию, например текст. Программа никогда не «знает», куда уходит информация, отправленная на стандартный вывод. Стандартный ввод — это место, откуда программа получает информацию. Так же, как и со стандартным выводом, программа никогда не «знает», откуда поступает информация. По умолчанию информация поступает с клавиатуры. Экран в качестве файла: Помимо обычных файлов, файлов каталогов, а также жестких и мягких ссылок в Linux и в OS X имеется дополнительный тип файла: файл устройства. Этот файл находится в файловой структуре Linux, обычно в каталоге /dev, и представляет внешнее устройство, например экран и клавиатуру, принтер или дисковый привод. Имя устройства, которое утилита who выводит после вашего имени пользователя — это имя файла экрана и клавиатуры. Например, когда утилита who отображает имя устройства pts/4, то полное имя экрана и клавиатуры — /dev/pts/4. Перенаправление стандартного вывода: Символ перенаправления вывода (>) заставляет оболочку перенаправить вывод команды в указанный файл, а не на экран Формат командной строки, перенаправляющий вывод, имеет следующий вид: команда [аргументы] > имя_файла где команда — это любая выполняемая программа (например, приложение или утилита), аргументы — это необязательные аргументы команды, а имя_файла — имя обычного файла, в который оболочка перенаправляет вывод Перенаправление стандартного ввода: Можно перенаправить не только стандартный вывод, но и стандартный ввод. Символ перенаправления ввода (<) заставляет оболочку перенаправить ввод в команду таким образом, чтобы его источником была не клавиатура, а указанный файл. Формат командной строки для перенаправления ввода имеет следующий вид: команда [аргументы] < имя_файла Каналы: Оболочка использует канал для подключения стандартного вывода одной команды к стандартному вводу другой команды. Канал (часто называемый конвейером) имеет тот же эффект, что и перенаправление стандартного вывода одной команды в файл с последующим использованием этого файла в качестве стандартного ввода в другую команду. Канал позволяет избавиться от отдельных команд и этого промежуточного файла. В качестве символа для канала используется вертикальная черта (|). Синтаксис командной строки, использующей канал, имеет следующий вид: команда_a [аргументы] | команда_b [аргументы] Здесь канал используется в одной строке для получения такого же результата, к которому привело бы использование трех командных строк: команда_a [аргументы]> temp команда_b [аргументы]< temp rm temp Фильтры: Фильтр — это команда, обрабатывающая входной поток данных для создания выходного потока данных. В командной строке, включающей фильтр, используется канал, связывающий стандартный вывод какой- нибудь команды со стандартным вводом фильтра. Еще один канал связывает стандартный вывод фильтра со стандартным вводом другой команды. В качестве фильтров могут использоваться далеко не все утилиты. Запуск команды в фоновом режиме: До сих пор все показанные команды запускались в активном режиме. При запуске команды в активном режиме оболочка, прежде чем вывести очередное приглашение на ввод команды и позволить вам продолжить с ней работу, ждет, пока команда завершит свою работу. Когда команда запускается в фоновом режиме, вам не нужно ждать завершения ее работы перед тем, как запустить еще одну команду. Задание — это серия из одной или нескольких команд, которые могут быть связаны друг с другом каналами. В окне или на экране может быть только одно активное задание, но в фоновом режиме могут выполняться сразу несколько заданий. Чтобы запустить задание в фоновом режиме, нужно в конце командной строки, непосредственно перед нажатием клавиши ВВОД, поставить знак амперсанда (&). Оболочка присвоит заданию номер в виде небольшого числа и отобразит этот номер в квадратных скобках. Использованная литература: Robert Love: Linux. System Programming. Александр Побегайло. Системное программирование в Windows Марк Г. Собель. Linux. Администрирование и системное программирование ru.wikipedia.org |