Разработка системной оболочки



 

Модуль 1. Основной модуль

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

#include <cstdlib>

#include <iostream>

#include <string.h>

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

Далее следует подключить процедуры, которые будут выполнять те или иные действия с файлами или каталогами. Отметим, что несмотря на то, что в Linux идеология работы с файлом и каталогом одинакова, одни и те же типы процедур для файла и каталога должны быть написаны по отдельности. Дело, по крайней мере, в том, что функции будут разными. Например, для удаления файла можно использовать процедуру удаления жестких ссылок unlink, тогда как для удаления каталога – процедуру rmdir. Другое дело, что обе функции можно объединить в одном программном модуле; если файл – то вызывается unlink , если каталог, то – rmdir. Правда, предварительно необходимо будет обозначить процедуру проверки свойств объекта: файл это или каталог и, в соответствии с результатом проверки, вызывать требующуюся процедуру.

# include " err 1. h " /*Модуль – обработчик ошибок*/

# include " df . h " /удаляет файл/

# include " md . h " /создает каталог/

# include " cp . h " /копирует файл/

# include " of . h " /открывает файл/

# include " rd . h " /переименовывает каталог/

# include " rf . h " /переименовывает файл/

# include " stfile . h " /выдает информацию о файле/

using namespace std ;

Теперь можно начать писать основную часть программы – главного модуля.

int main()

char path[300];

char nname[300];

char c [50];

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

cout<<”if you want delete file type \"del-f\"\n";

cout <<"if you want open file type \"op-f\"\n";

cout <<"if you want withdraw file stats type \"st-f\"\n";

cout <<"if you want copy file type \"cp-f\"\n";

cout <<"if you want rename file type \"rn-f\"\n";

cout <<"if you want delete dir type \"del-d\"\n";

cout <<"if you want create dir type \"cr-d\"\n";

cout <<"if you want exit type \"exit\"\n";

Это – часть, «задающая вопросы» о том, что мы хотим сделать. Теперь рабочая часть (построенная в виде бесконечного цикла). В зависимости от того, что именно мы введем из предложенного выше списка, на выполнение будет вызываться та или иная функция (описанная ниже в рамках цикла while).  

while ( TRUE )

{

cin >> c ;

В зависимости от того, чему равна переменная с, в рамках этого цикла вызывается та или иная процедура. Например, если эта переменная равна " exit ", то производится выход из цикла и программа прекращает работу. Если с= del - f, вызывается функция delfile удаления файла, и т.д.

if(strcmp(c, "exit")==0)

return 0;

if(strcmp(c, "del-f ")==0)

{

cout<<"Enter path name\n";

cin>>path;

delfile(path);

cout<<"Enter command\n";

}

Здесь вызывается разрабатываемая нами функция delfile, см ниже. Параметром этой функции является переменная path. Тем самым, здесь, в основном модуле мы лишь задаем значение переменной path, передаем в функцию delfile; в основном модуле НЕ происходит непосредственно удаления файла. А вот при вызове функции delfile происходит ее работа, которая как раз и заключается в удалении файла.

После чего программа пишет Enter command  (введите команду). Т.е. после того, как процедура удаления файла закончила свою работу, предлагается ввести новую команду (например, rn-f; cr-d и т.д.); после ввода команды мы возвращаемся в начало цикла while , затем вновь выполняем команду в зависимости от того, какую именно команду выбрали. И т.д. Так происходит до тех пор, пока в качестве переменной с не будет выбрано exit. После чего программа завершит свою работу.

Рассмотрим далее основной модуль.

if(strcmp(c, "op-f")==0)

{

cout<<"Enter path name\n";

cin>>path;

openfile(path);

cout<<" Enter command\n";

}

if(strcmp(c,"st-f")==0)

{

cout<<" Enter path name\n";

cin>>path;

statfile(path);

cout<<"Enter commаnd\n";

}

if(strcmp(c,"cp-f")==0)

{

cout<<" Enter path name\n";

cin>>path;

cout<<"enter new name\n";

cin>>nname;

copyfile(path, nname);

cout <<" Enter command \ n ";

}

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

if ( strcmp ( c , " rn - f ")==0)

{

cout<<"Enter path name\n";

cin>>path;

cout<<"enter new name\n";

cin>>nname;

renamefile(path,nname);

cout<<"Enter command\n";

}

if(strcmp(c, "del-d")==0)

{

cout<<" Enter path name\n";

cin>>path;

deldir(path);

cout<<"Enter command\n";

}

if(strcmp(c,"cr-d")==0)

{

cout<<" Enter path name\n";

cin>>path;

makedir(path);

cout<<"Enter command\n";

}

}

return 0;

}

В данном модуле не используются никакие специфические функции или процедуры. Только стандартные и написанные нами. Задача основного модуля - используя остальные модули выполнять то, что требуется от системной оболочки. Основной модуль передаёт некоторое значение (в данном случае он передаёт пути к файлам или каталогам) в написанные нами процедуры (которые находятся в модулях) в зависимости от параметров входной строки. То есть наш основной модуль выполняет функции командного интерпретатора.

В нем содержатся вызовы функций, работающих с файлами и каталогами, например, err 1, df , md и др. На данный момент эти функции еще отсутствуют, их следует создать. Пока же, чтобы проверить работу основного модуля, целесообразно создать лишь (пустые) формы этих функций, т.е. заготовки. Вызов их не будет производить никаких действий. Но в дальнейшем, по мере реализации всех функций, они будут работать.

Например, для функции (модуля) открытия файла можно предварительно написать следующую заготовку:

void openfile(char *path)

{

continue;

}

и т.д., для всех функций, для которых в основном модуле имеются вызовы.

Cм. также Приложение 2 (необходимо создать соответствующие заголовочные файлы – для каждой функции).

Впоследствии, по мере реализации каждой из функций, их работу можно будет проверять, запуская основной модуль и вызывая соответствующие операции. Например, для вызова функции открытия файла из основного модуля после его запуска следует ввести op - f и нажать Enter.

Примечание: не забывайте заново осуществлять компиляцию и сборку основного модуля всякий раз, когда Вы изменили хотя бы одну из функций, к которым он обращается! С целью экономии времени, это целесообразно автоматизировать на основе использования Makefile. Как это делается, описано в первой части настоящих методических указаний.

 

 


Дата добавления: 2019-03-09; просмотров: 318; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!