Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
SysSoft.doc
Скачиваний:
520
Добавлен:
16.03.2016
Размер:
4.36 Mб
Скачать

Текст программы g

#define INCL_BASE

#define INCL_DOS

#include <os2.h>

#include <string.h>

#include <stdio.h>

#include <stdlib.h>

#include "progr.h"

#include "func.h"

/*Глобальные переменные*/

char myword[]="PROGR_G.EXE":

/*Главная функция*/

int main(int argc, char* argv[ ], char*envp[ ])

{

/*Локальные переменные*/

int i,j; strcpy(Word, myword);

/Инициализация семафоров*/

rc=DosOpenEventSem("\\SEM32\\PIPESEM", &PipeSem);

if (rc!=0) { HaltSystem(“Open Sem (PipeSem) ", rc); }

rc=DosOpenEventSem("\\SEM32\\EXITSEM3", &ExitSem3);

if (rc!=0) { HaltSystem(“Open Sem (ExitSem3) ", rc);}

rc=DosOpenEventSem("\\SEM32\\WRITEFILE", &FileSem);

if (rc!=0) { Hal tSystem( "Open Sem (FileSem) ", rc);}

rc=DosOpenEventSem("\\SEM32\\POINT2SEM", &Point2Sem);

if (rc!=0) { HaltSystem("Create Sem (Point2Sem) ", rc);}

rc=DosOpenEventSem("\\SEM32\\POINT3SEM", &Point3Sem);

if (rc!=0) { HaltSystem("Create Sem (Point3Sem) ", rc);}

rc=DosOpenEventSem("\\SEM32\\POINT1SEM", &Point1Sem);

if (rc!=0) { HaltSystem("Create Sem (Point1Sem) ", rc);}

/* Проверка количества аргументов */

if (argc!=4) { HaltSystem( "Ошибка командной строки", rc);}

/*Инициализация переменных для записи в транспортер и файл*/

WriteHandle=atoi(argv[2]); ReadHandle=atoi(argv[1]);FileOpen=atoi(argv[3]);

/*0жидание свободного транспортера*/

do { DosWaitEventSem(PipeSem, -1);

rc=DosResetEventSem(PipeSem, &NPost);

} while (rc!=0);

/* Работа с Pipe каналом*/

rc=DosRead(ReadHandle, (PVOID)&0ldInform, sizeof(0ldlnform), &BytesReaden);

DosPostEventSem(PipeSem);

if (rc!=0) (HaltSystem(“Read Pipe", rc);}

/*Уведомление предка о завершении инициализации*/

if (OldInform.Number==1)

{ rc=DosPostEventSem(ExitSem3);

if (rc!=0) { HaltSystem(“PostSem (ExitSem3) ", rс);} }

else { do { Old Inform.Number--;

DosWaitEventSem(PipeSem, -1);

Rc=DosResetEventSem(PipeSem, &NPost);

} while (rc!=0);

rc=DosWrite(WriteHandle, (PVOID)&0ldInform, sizeof(0ldInform), &BytesWritten);

DosPostEventSem(PipeSem);

if (rc!=0) { HaltSystem("Write Pipe", rc);} }

/*3адание строк аргументов*/

for (i=0;i<=strlen(myword);i++ ) { Argument[i]=myword[i]; }

j=i; Aгgument2=itoa(ReadHandle, MyBuffer, 10);

for (i=0;i<=strlen(Aгgument2);i++) { Argument[j+i]=MyBuffer[i]; }

j+=i; Argument[j-i]=' '; Aгgument2=itoa(WriteHandle, MyBuffer, 10);

for (i=0;i<=strlen(Argument2);i++) { Argument [i+j]=MyBuffer[i]; }

j+=i; Argument[j-i]=' '; Argument2=itoa(FileOpen, MyBuffer, 10);

for (i=0;i<strlen(Argument2);i++) { ArgumentEH-jl-MyBufferCi]; }

/*Выполнение процесса - цикл */

strcpy(Pmessege, "Программа "); strcat(Pmessege, myword);

VioWrtNAttr(&atr, 80*25, 0, 0, 0); VioWrtCharStr(Pmessege, sizeof(PMessege), 14, 54, 0);

strcpy(Pmessege, "Запущена в "); strcat(Pmessege, OldInform.LaunchTime);

VioWrtNAttr(&atr, 80*25, 0, 0, 0);

VioWrtCharStr(Pmessege, sizeof(PMessege), 15, 54, 0);

strcpy(Fmessege1, myword); strcat(Fmessege1, " "); strcat (Fmessege1, PMessege);

strcpy(Pmessege, "Программой "); strcat(Pmessege, 0ldInform.ParentName);

VioWrtNAttr(&atr, 80*25, 0, 0, 0);

VioWrtCharStr(Pmessege, sizeof(PMessege), 16, 54, 0);

strcpy(FMessege2, myword); strcat(FMessege2, " "); strcat (FMessege2, PMessege);

for(i=0;i<22;i++)

{ VioWrtNAttr(&atr, 80*25, 0, 0, 0);VioWrtCharStr("|",1, 17, 54+i, 0) ;

for (j=0;j<(25000*Speed);j++); };

/*Получение времени загрузки программ-потомков*/

DosGetDateTime(&Time);

strcpy(MyTime, itoa(Time.hours, MyBuffer, 10)); strcat(MyTime, ":");

strcat(MyTime, itoa(Time.minutes, MyBuffer, 10)); strcat(MyTime,":");

strcat(MyTime, itoa(Time.seconds, MyBuffer, 10)); strcat(MyTime,":");

strcat(MyTime, itoa(Time.hundredths, MyBuffer,10));

strcpy(Newlnform.LaunchTt me, MyTime);

strcpy(NewInform.ParentName, myword); NewInform.Number=1;

strcpy(Pmessege, "Завершена в "); strcat(Pmessege, MyTime);

ViowrtNAttr(&atr, 80*25, 0, 0, 0);

VioWrtCharStr(Pmessege, sizeof(PMessege), 18, 54, 0);

strcpy(FMessege3, myword); strcat(FMessege3, " ");

strcat (FMessege3, PMessege);

/*0жидание доступности записи в файл и немедленная запись в файл*/

do{ DosWaitEventSem(FileSem, -1);

rc=DosResetEventSem(FileSem, &BytesWritten);

} while (rc!=0);

DosWrite(FileOpen, (PVOID)&Fmessege1, sizeof(Fmessege1), &BytesWritten);

DosWrite(FileOpen, (PVOID)&FMessege2, sizeof(FMessege2), &BytesWritten);

DosWrite(FileOpen, (PVOID)&FMessege3, sizeof(FMessege3), &BytesWritten);

DosPostEventSem(FileSem);

/*Алгоритм прохождения точки 4*/

do { DosWaitEventSem(Point1Sem, -1);

rc=DosResetEventSem(Point1Sem,&BytesReaden);

} while (rc!=0);

DosPostEventSem(Point3Sem);

DosQueryEventSem(Point3Sem, &BytesWritten);

DosPostEventSem(Point1Sem);

if (BytesWritten==4)

{

/*3апись сообщения в Pipe; имя предка(Progr_A) и время запуска программ*/

rc=DosWrite(WriteHandle, (PVOID)&NewInform, sizeof(NewInform), &BytesWritten);

if (rc!=0) { HaltSystem("(DosWrite)", rc); }

/*Создание семафора ожидания инициализации ресурсов потомками*/

rc=DosCreateEventSem("\\SEM32\\EXITSEM4", &ExitSem4, DC_SEM_SHARED, 0);

if (rc!=0) { HaltSystem("Create Sem (ExitSem4) ", rc);}

/*3апуск программ-потомков*/

rc=DosExecPgm(FailFileb, sizeof(FailFileb), 1, Argument, 0, &ResCodeb, "progr_k.exe") ;

if (rc!=0) { HaltSystem("(DosExecPgm)", rc);}

/*0жидание инициализации ресурсов потомками*/

DosWaitEventSem(ExitSem4, -1);

DosCloseEventSem(ExitSem4);

}return(0);}

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]