Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Лекции по СПО3

.doc
Скачиваний:
49
Добавлен:
02.05.2014
Размер:
44.03 Кб
Скачать
В Г Васильев
Лабораторная работа 2

по курсу "Системное программное обеспечение ЭВМ»

Разработка командного процессора
Работа рассчитана на 4 часа (2 занятия)

Цель работы: научиться создавать консольные программы с применением традиционных библиотечных функций и функций Win32® API

Задание: написать программу - командный процессор, в которой предусмотреть выполнение внутренних команд

CLS - чистим экран CLS

SET - получаем список переменных окружения

EXIT - выход из командного процессора

CMD - запустить командный процессор WINDOWS

MD - создание каталога

DIR - получение списка файлов в каталоге

и внешних команд (утилит, программ Windows). В качестве приглашения для ввода команд использовать символ $ (как в OC UNIX )

Командный процессор CMD.EXE и COMMAND.COM

Файлы CMD.EXE (Windows) и COMMAND.COM (DOS) - одна из наиболее интересных частей OC, как с точки зрения тех услуг ОС, которые она предоставляет пользователю, так и с точки зрения принципов ее функционирования.

CMD.EXE / COMMAND.COM имеет несколько функций. Прежде всего, это "процессор команд", что означает возложенные на него функции ввода команды, набираемой на клавиатуре, и определения дальнейших действий. Когда вводится внутренняя команда, такая как DIR, COPY, TYPE, REM или PAUSE, то запрашивается процедура, "встроенная" в COMMAND.COM, так что она может выполняться немедленно.

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

Существует три типа файлов обработки команд, поиск которых в определенном порядке осуществляет COMMAND.COM. Название команды точно совпадает с именем файла, в котором хранится программа обработки команды. Три типа файлов обработки команд различаются расширениями имен файлов. Три расширения, в порядке их приоритетности: ".COM", которое обозначает программный файл в одном из двух программных форматов; ".EXE", обозначающее программный файл другого формата и ".BAT", обозначающее файл пакетной обработки.

Когда COMMAND.COM находит программный файл в любом формате, он выполняет загрузку этого файла в память и выполняет любое необходимое преобразование. После загрузки файла и формирования приставки программного сегмента, COMMAND.COM передает управление этой программе, так чтобы она могла выполнить свою работу.

Если файл обработки команды относится к типу ".BAT", то есть является файлом пакетной обработки, то он содержит в формате текстового файла в коде ASCII последовательность команд, которые должны выполняться так, как будто они вводятся с клавиатуры. Одна из многих задач COMMAND.COM заключается в отслеживании позиции в файле пакетной обработки, так чтобы после выполнения одной команды сразу переходить к другой. Если в процессе обработки одного пакетного файла будет вызван другой, то возврата к первому не произойдет, так как файлы пакетной обработки не могут быть вложенными, зато их можно объединять в цепочку.

Файл COMMAND.COM имеет значительно больше функций, чем было описано. Одна из причин, по которой COMMAND.COM оформляется в виде отдельной программы и не объединяется с другими системными файлами, заключается в облегчении разработки прикладных версий. Это одна из основных возможностей адаптации ПК к нуждам пользователей. Если необходимо часть пользовательских команд сделать внутренними или изменить способ работы интерпретатора команд, то можно написать собственную программу COMMAND.COM.

Подсказки

Для вывода читаемого текста на экран требуется перекодировка символов (кодовая страница cp866). Вот пример:

char buffer_1[128];

char buffer_2[128];

sprintf( buffer_1, "командный процессор не найден\n");

CharToOem(buffer_1, buffer_2); // Конвертируем в cpp866 для вывода читаемого текста

printf("%s", buffer_2);

Для работы может потребоваться семейство функций spawnl. Вот пример ее вызова spawnl

#include <process.h>

#include <stdio.h>

#include <conio.h>

void spawnl_example(void)

{

int result;

clrscr();

result = spawnl(P_WAIT, "bcc32.exe", "bcc32.exe", NULL);

if (result == -1)

{

perror("Error from spawnl");

exit(1);

}

}

int main(void)

{

spawnl_example();

return 0;

}

Запуск программ возможен на основе функции Windows с названием WinExec

UINT WinExec(

LPCSTR lpCmdLine, // строка с именем программы

UINT uCmdShow // вид вывода на экран в смысле

//скрытая или нормальная и так далее

);

Пример программы, которая запускает калькулятор:

#include "windows.h"

void main()

{

WinExec("c:\\windows\\system32\\calc.exe",SW_SHOW);

}

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

ERROR_BAD_FORMAT формат exe файла неверен

ERROR_FILE_NOT_FOUND файл не найден

ERROR_PATH_NOT_FOUND путь не найден

4