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

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

#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_D.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\\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 (Potnt1Sem) ", rc);}

rc=DosOpenEventSem("\\SEM32\\EXITSEM2", &ExitSem2);

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

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

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

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

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

/*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!=) { HaltSystem("Read Pipe", rc);}

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

if (0ldInform.Number==1)

{ rc=DosPostEventSem(ExitSem2);

if (rc!=0) { HaltSystem(“PostSem (ExitSem2) ", rc);} }

else { do { 0ldInform.Number--;

DosWaitEventSem(PipeSem, -1);

Rc=DosResetEventSem(PipeSem,&NPost);

} while (rc!=0);

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

DosPostEventSem(PipeSem);

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

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

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

j=1; Argument2=itoa(ReadHandle, MyBuffer,10);

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

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

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

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

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

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

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

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

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

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

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

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

VioWrtNAttr(&atr, 80*25, 0, 0, 0); VioWrtCharStr(Pmessege, sizeof(PMessege), 10, 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, 11, 54+i, 0);

for (j=0;j<(15000*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.LaunchTime, MyTime);

strcpy(NewInform.ParentName, myword); Newlnform.Number=2;

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

VioWrtNAttr(&atr, 80*25, 0, 0, 0); VioWrtCharStr(Pmessege, sizeof(PMessege), 12, 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):

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

rc=DosPostEventSem(Point2Sem) ;

if (rс==0)

{ do{ DosQueryEventSem(Point2Sem, &BytesWritten):

}while (BytesWritten<=2);

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

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

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

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

re=DosCreateEventSem("\\SEM32\\EXITSEM3", &ExitSem3, DC_SEM_SHARED, 0);

if (re!=0) { НаltSystem("Create Sem (ExitSem3) ", rc);}

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

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

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

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

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

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

DosWaitEventSem(ExitSem3, -1);

DosCloseEventSem(ExitSem3);

}return(0);}

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