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

Лаборатораная №2

.docx
Скачиваний:
18
Добавлен:
20.06.2014
Размер:
34.93 Кб
Скачать

ЛИПЕЦКИЙ ГОСУДАРСТВЕННЫЙ ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ

КАФЕДРА АВТОМАТИЗИРОВАННЫХ СИСТЕМ УПРАВЛЕНИЯ

Лабораторная работа №2

по дисциплине

«Операционные системы»

Студент

подпись, дата

фамилия, инициалы

Группа

АИ-11-1

Принял

доц., к.т.н.

Журавлева М. Г.

ученая степень, звание

подпись, дата

фамилия, инициалы

Липецк 2013

  1. Задание

Реализовать на языке C/C++ интерпретатор командной строки (shell) для ОС Windows.

  1. Цель работы

Изучить принципы построения интерпретаторов команд для многозадачных операционных систем и получить навыки практического использования средств системного программного обеспечения для порождения потоков и процессов, перенаправления ввода/вывода.

  1. Краткие теоретические сведения

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

Функция CreateProcess создает новый процесс и его первичный (главный) поток. Новый процесс запускает заданный исполняемый файл в контексте безопасности вызывающего процесса.

BOOL CreateProcess(

LPCTSTR lpApplicationName , // имя исполняемого модуля

LPTSTR lpCommandLine, // командная строка

LPSECURITY_ATTRIBUTES lpProcessAttributes , // SD (дескриптор безопасности)

LPSECURITY_ATTRIBUTES lpThreadAttributes, // SD

BOOL bInheritHandles, // дескриптор параметра наследования

DWORD dwCreationFlags, // флажки создания

LPVOID lpEnvironment, // новый блок конфигурации

LPCTSTR lpCurrentDirectory, // имя текущего каталога

LPSTARTUPINFO lpStartupInfo, // информация предустановки

LPPROCESS_INFORMATION lpProcessInformation // информация о процессе

);

  1. Листинг программы

#include <Windows.h>

#include <stdio.h>

#include <conio.h>

#include <string.h>

#include <locale.h>

#define BUF_SIZE 256

#define BUFF 100

int main(int argc,LPTSTR argv[])

{

setlocale(LC_ALL, "RUS");

PROCESS_INFORMATION PI;

STARTUPINFO S;

HANDLE InConsole=GetStdHandle(STD_INPUT_HANDLE);

HANDLE res=GetStdHandle(STD_OUTPUT_HANDLE),hOut=NULL,hOut1=NULL;

CHAR *CommandLine=new CHAR[BUF_SIZE];

CHAR *Comm=new CHAR[BUFF];

CHAR Dir[21]="C:\\Windows\\System32\"";

Dir[19]='\0';

CHAR *Comm1=new CHAR[BUFF];

LPDWORD count = new DWORD;

BOOL condition=false;

SECURITY_ATTRIBUTES security = {sizeof(SECURITY_ATTRIBUTES),0,TRUE};

int nums=0,tmp=0;

while(TRUE)

{

WriteConsole(res,"\n>",2,count,NULL);

ReadConsole(InConsole,CommandLine,BUF_SIZE,count,NULL);

CommandLine[*count-2] = '\0';

GetStartupInfo(&S);

if (!strcmp(CommandLine,"close"))

{

break;

}

if (strstr(CommandLine,"#"))

{

for(int i=0;i<strlen(CommandLine);i++)

{

if(CommandLine[i]=='#')

{

tmp=i;

}

}

for(int i=tmp+1;i<strlen(CommandLine);i++)

{

Comm[nums]=CommandLine[i];

nums++;

}

Comm[nums]='\0';

hOut=CreateFile(Comm,GENERIC_WRITE,0,&security,CREATE_ALWAYS,0,NULL);

condition=TRUE;

S.dwFlags = STARTF_USESTDHANDLES;

S.hStdInput = GetStdHandle(STD_INPUT_HANDLE);

S.hStdOutput = hOut;

for(int i=tmp;i<strlen(CommandLine);i++)

{

CommandLine[i-1]='\0';

}

nums=0;

}

if (strstr(CommandLine,"$"))

{

for(int i=0;i<strlen(CommandLine);i++)

{

if(CommandLine[i]=='$')

{

tmp=i;

}

}

for(int i=tmp+1;i<strlen(CommandLine);i++)

{

Comm1[nums]=CommandLine[i];

nums++;

}

Comm1[nums]='\0';

hOut1=CreateFile(Comm1,GENERIC_READ,0,&security,OPEN_EXISTING,0,NULL);

condition=TRUE;

S.dwFlags = STARTF_USESTDHANDLES;

S.hStdInput = hOut1;

if(hOut == NULL)

{

S.hStdOutput = GetStdHandle(STD_OUTPUT_HANDLE);

}

for(int i=tmp;i<strlen(CommandLine);i++)

{

CommandLine[i-1]='\0';

}

nums=0;

}

int slash=0;

if(strstr(CommandLine,".exe"))

{

for(int i=strlen(CommandLine);i>0;i--)

{

if(CommandLine[i]=='\\')

{

slash=i;

goto N;

}

}

N: for(int i=0;i<=slash;i++)

{

Dir[i]=CommandLine[i];

}

Dir[slash+1]='\0';

}

if (strstr(CommandLine,"functo"))

{

CommandLine[0]='O';

CommandLine[1]='S';

CommandLine[2]='.';

CommandLine[3]='e';

CommandLine[4]='x';

CommandLine[5]='e';

CHAR Dir[4]="C:\\";

Dir[4]='\0';

if(CreateProcess(NULL,CommandLine,NULL,NULL,condition,NULL,NULL,Dir,&S,&PI)==false)

{

printf("Ошибка! Неверная комманда\n");

}

}

else

{

if(CreateProcess(NULL,CommandLine,NULL,NULL,condition,NULL,NULL,Dir,&S,&PI)==false)

{

printf("Ошибка! Неверная комманда\n");

}

}

WaitForSingleObject(PI.hProcess,INFINITE);

if(hOut!=NULL)

{

CloseHandle(hOut);

condition=false;

hOut=NULL;

}

if(hOut1!=NULL)

{

CloseHandle(hOut1);

condition=false;

hOut1=NULL;

}

}

delete count;

return 0;

}