Лаборатораная №2
.docxЛИПЕЦКИЙ ГОСУДАРСТВЕННЫЙ ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ
КАФЕДРА АВТОМАТИЗИРОВАННЫХ СИСТЕМ УПРАВЛЕНИЯ
Лабораторная работа №2
по дисциплине
«Операционные системы»
|
Студент |
|
|
|
|
|
|||||||||
|
|
|
подпись, дата |
|
фамилия, инициалы |
|
|||||||||
|
Группа |
|
АИ-11-1 |
|
|
|
|||||||||
|
|
|
|
|
|
|
|||||||||
|
Принял |
|
|
|
|
|
|||||||||
|
доц., к.т.н. |
|
|
|
Журавлева М. Г. |
|
|||||||||
|
ученая степень, звание |
|
подпись, дата |
|
фамилия, инициалы |
|
Липецк 2013
-
Задание
Реализовать на языке C/C++ интерпретатор командной строки (shell) для ОС Windows.
-
Цель работы
Изучить принципы построения интерпретаторов команд для многозадачных операционных систем и получить навыки практического использования средств системного программного обеспечения для порождения потоков и процессов, перенаправления ввода/вывода.
-
Краткие теоретические сведения
Командный интерпретатор является простейшим средством запуска программ и управления системой. Входной информацией для него является строка символов, представляющая команду и ее аргументы. Командный интерпретатор порождает новый процесс, соответствующий распознанной команде, передавая ее аргументы и, при необходимости, перенаправляя стандартные потоки ввода/вывода. Выполнение некоторых команд (встроенных) интерпретатор реализует самостоятельно внутри своего процесса.
Функция 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 // информация о процессе
);
-
Листинг программы
#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;
}