Курсовая работа: Эмуляция командного процессора ОС UNIX в среде Windows 9x
RENAME (REN) – переименование файла или группы файлов;
Примерами команд управления системой служат:
COMMAND – запуск командного процессора;
EXIT – выход из командного процессора.
3. Программная реализация
3.1 Выбор языка программирования
Для разработки эмуляции командного процессора ОС UNIX в среде Windows9x была разработана программа на языке Borland Pascal 7.0.
Язык Pascal, начиная с момента своего создания Н. Виртом в 1971 году, играет особую роль и в практическом программировании, и в его изучении. С непревзойденной четкостью в нем реализованы принципы структурного программирования. Pascal стал первым языком программирования, с которым знакомится большинство будущих программистов.
Среда Borland Pascal 7.0 обладает мощными и удобными средствами для написания и отладки кода программы. Также он поддерживает концепции объектно-ориентированного проектирования, хорошо структурирован и удобен в обращении.
3.2 Инструкция пользователю
Запуск программы в ОС Windows 95/98/Me/2000/XP:
Кнопка “Пуск” – “Выполнить” – “Обзор”, найти и выделить файл с именем Unix_com.exe, - нажать “OK”. После запуска на экране монитора появится следующее сообщение: - >Эмулятор команд ОС UNIX<-.
Символ $ - приглашение к вводу команд. При вводе команды exit происходит выход в систему. При неправильном вводе команды или при любой другой ошибке появляется сообщение: “Команда введена неправильно!”.
3.3 Описание структуры программы
Функции:
Unix_num – определение номера команды,
Error – ошибка при неверном формате команды,
Compare – сравнение двух строк.
Процедуры:
Reout – определение имени устройства при перенаправлении ввода-вывода,
Spaces – удаление лишних пробелов из строки,
Attr – атрибуты файлов,
Diff – сравнение файлов,
Scan – составление списка файлов указанного каталога,
Man – справка,
LS – вывод списка файлов в каталоге,
DIRCMP – сравнение содержимого двух каталогов,
TR – поиск и замена,
COMM – построчное сравнение содержимого двух текстовых файлов,
RMDIR – удаление каталога,
CAT – вывод содержимого файлов,
MV - переименование или перемещение.
3.4 Используемые модули
Модулю System отводится ведущая роль при организации программ на Pascal, так как формирование загрузочного выполнимого EXE-файла начинается именно с этого модуля. В силу своей исключительной важности подключение данного модуля в программу не требует отдельной строки вида Uses System. Интегрированная система включает модуль System в любую пользовательскую программу автоматически.
Процедуры и функции модуля Dos предназначены для обеспечения интерфейса с программами операционной системы. После загрузки DOS большинство пользовательских функций реализуется через прерывание с номером 21h, называемое прерыванием DOS.
3.5 Пример работы программы
-> Эмулятор команд ОС UNIX <-
$ man man
Описание команд ОС UNIX
man имя_команды
Список доступных команд:
ls, dircmp, tr, comm, rmdir, cat, mv
Выход – команда exit
$ ls
UNIX_COM.EXE UNIX_COM.PAS
$ dircmp 1 2
Файлы из первого каталога
213.TXT
Файлы из второго каталога
321.TXT
Файлы общие для двух каталогов
123.TXT
$ comm. –23 5.TXT 7.TXT
matrix
matrix reload
$ rmdir 777
Каталог 777 удален.
$ cat 7.txt
matrix revolution
matrix reload
matrix
$ mv 7.txt 9.txt
Файл перенесен!
Заключение
В курсовой работе по дисциплине "Операционные системы" на тему "Эмуляция командного процессора ОС UNIX в среде Windows 9х" были рассмотрены вопросы касающиеся файловой системы операционных систем UNIX и MS-DOS.
Разработана программа на языке Pascal. В данной программе были реализованы следующие команды ls, dircmp, tr, comm., rmdir, cat, mv и man. Работа по созданию программы позволила приобрести практические навыки системного программирования.
Программа достаточно не требовательна к аппаратному и программному обеспечению.
Список литературы
1. Паскаль для персональных компьютеров: Справ. пособие / Ю.С. Бородич, А.Н. Вальвачев, А.И. Кузьмич. – Мн.: Выш. шк.: БФ ГИТМП “НИКА”, 1991. – 365 с.: ил.
2. Информатика: Учеб. пособие для студ. вузов / А.В. Могилев, Н.И. Пак, Е.К. Хеннер; под ред. Е.К. Хеннера. – М.: Изд. центр «Академия», 2000. – 816 с.
3. UNIX: Справочник / Рейчард К., Фостер - Джонсон Э. – Спб: Питер Ком, 1999. - 384 с.
Приложение А
Листинг программы
Program unix_com;
Uses Dos;
Var comu:string;
s_or_f:text;
k:integer;
Function Unix_num (comu:string):integer;
const inp:array[1..9] of string[6] = (
'ls', 'dircmp', 'tr', 'comm', 'rmdir', 'cat', 'mv', 'man', 'exit');
var f:boolean;
i:integer;
Begin f:=False;
for i:=1 to 9 do
if (Copy(comu, 1, Pos(' ', comu)-1)=inp[i]) or (comu=inp[i]) then
begin
f:=True;
Break;
end;
if not f then i:=11;
Unix_num:=i;
End;
Procedure Reout(var comu:string);
var Dev:string;
Flag:boolean;
Begin
Dev:='con';
Flag:=False;
if Pos ('>', comu) <> 0 then
begin
if Pos ('>>', comu) <> 0 then
begin
Delete (comu, Pos('>', comu), 1);
Flag:=True;
end;
Dev:=Copy(comu, Pos('>', comu)+1, Length(comu)-Pos('>', comu)+1);
if Dev[1]='' then Delete(dev, 1, 1);
Delete(comu, Pos('>', comu), Length(comu)-Pos('>', comu)+1);
end;
Assign (s_or_f, dev);
if Flag then begin
{$I-} Append (s_or_f); {$I+}
if IOResult <> 0 then Rewrite (s_or_f);
end
else Rewrite(s_or_f);
End;
Function Error (comu:string):boolean;
Begin
Error:=False;
if Pos(' ', comu)=0 then
begin
WriteLn('Команда введена неверно!');
Error:=True;
end;
end;
Procedure Spaces (var s:string);
Begin
while Pos(' ', s)<>0 do Delete(s, Pos(' ', s), 1);
while Pos(' ', s)=1 do Delete(s, 1, 1);
if s[Length(s)]=' ' then Delete (s, Length(s), 1);
end;
Procedure Attr(at:byte);
const Ast:array[0..6] of string[5] = (
'-', 'R', 'H', 'S', 'V', '<DIR>', 'A');
A16:array[0..6] of byte = (
$00, $01, $02, $04, $08, $10, $20);
var i, i1, i2, i3, i4, i5:integer;
at1:byte;
ss:string[20];
Begin
for i:=0 to 1 do
for i:=1 to 2 do
for i:=2 to 3 do
for i:=3 to 4 do
for i:=4 to 5 do
for i:=5 to 6 do
begin
at1:=A16[i]+A16[i1]+A16[i2]+A16[i3]+A16[i4]+A16[i5];
if at1=at then
begin
ss:=Ast[i]+Ast[i1]+Ast[i2]+Ast[i3]+Ast[i4]+Ast[i5]+'';
write(s_or_f, ss);
Exit;
end;
end;
End;
Procedure Ls(comu: string);
var
Info: SearchRec;
dt: DateTime;
atr: byte;
keys, maska, cmd1: string;
o1, p1, a1, p, l, r: boolean;
nn, pos1: integer;
c0: string[1];
begin
atr := $3F;
Spaces(comu);
cmd1 := comu;
Delete(comu, 1, 3);
keys := '';
if Pos('-', comu) <> 0 then
begin
if Pos(' ', comu) = 0 then
pos1 := Length(comu)
else
pos1 := Pos(' ', comu);
keys := Copy(comu, 1, pos1);
Delete(comu, 1, pos1);
end;
if Pos('l', keys) <> 0 then
l := True
else
l := False;
if Pos('1', keys) <> 0 then
o1 := True
else
o1 := False;
if Pos('a', keys) <> 0 then
a1 := True
else
a1 := False;
if Pos('p', keys) <> 0 then
p1 := True
else
p1 := False;
if Pos('R', keys) <> 0 then
r := True
else
r := False;
if comu <> '' then
begin
if comu[Length(comu)] <> '\' then
maska := comu + '\*.*'
else
maska := comu + '*.*'
end
else
maska := '*.*';
FindFirst(maska, atr, Info);
if Info.Name = '.' then
FindNext(Info);
nn := 0;
repeat
if (DosError = 0) and a1 and (Info.Name ='..') then
begin
Write(s_or_f, Info.Name, ' ':(15 - Length(Info.Name)));
Inc(nn);
end;
if (DosError = 0) and (Info.Name <> '..') then
begin
if (Info.Attr = $10) and p1 then
Info.Name := Info.Name + '\';
if (Info.Attr = $02) or (Info.Attr = $10) then
begin
if a1 then
begin
Write(s_or_f, Info.Name, ' ':(15 - Length(Info.Name)));
Inc(nn);
end;
end
else
begin
Write(s_or_f, Info.Name, ' ':(15 - Length(Info.Name)));
Inc(nn);
end;
if l then
begin
Attr(Info.Attr);
UnpackTime(Info.Time, DT);
with DT do
begin
c0 := '';
if Day < 10 then
c0 := '0';
Write(s_or_f, c0, Day, '-');
c0 := '';
if Month < 10 then
c0 := '0';
Write(s_or_f, c0, Month, '-', Year);
c0 := '';
if Hour < 10 then
c0 := '0';
Write(s_or_f, ' ', c0, Hour, ':');
c0 := '';
if Min < 10 then
c0 := '0';
if o1 then
begin
WriteLn(s_or_f, c0, Min, ' ');
Inc(k);
end
else
begin
if nn = 3 then
begin
WriteLn(s_or_f, c0, Min, ' ');
nn := 0;
Inc(k);
end