/* эта часть - только для процесса - Монитора */
/* заполнение управляющей информации о процессе */
/* состояние процесса пока что - не запущен */
mtr[nt].status=-1;
/* установка случайной добавки к приоритету */
mtr[nt].prty=(int)(10.* rand()/RAND_MAX);
setpriority(PRIO_PROCESS,pw,mtr[nt].prty);
/* запоминание ID процесса-Политикана */
mtr[nt].chpid=pw;
}
unlink(gFname);
mknod(gFname,S_IFIFO|0x1b6,0);
sleep(1);
/* перебор запущенных процессов */
for (cnt=nt=0; nt<NT; nt++) {
/* проверка - не закончился ли процесс */
pw=waitpid(mtr[nt].chpid,&s,WNOHANG);
if (pw==mtr[nt].chpid) {
printf("%d\n",s);
/* если процесс закончился, значит, запуск Политикана не удался */
printf("Политикан %s не запущен\n",mtr[nt].tr->name);
}
else {
/* состояние процесса - запущен */
mtr[nt].status=0;
/* подсчет запущенных Политиканов */
cnt++;
/* открытие каналов для Политиканов */
fdE[nt]=open(mtr[nt].tr->name,O_WRONLY);
printf("%s Канал для %s открыт - %d\n",curtime(),mtr[nt].tr->name,fdE[nt]);
}
}
/* если счетчик запущенных 0 - завершение Монитора */
if (!cnt) exit(0);
/* цикл запуска Политиканов */
sleep(1);
/* инициализация генератора случайных чисел */
srand(time(NULL));
/* вычисление общей потребности стада с запасом 20% */
total=0;
for(nt=0; nt<NT; nt++)
total+=((mtr[nt].tr->weight)*50);
total=2*total;
/* пауза - чтобы Политиканы успели запуститься */
sleep(1);
/* цикл, пока не буден удовлетворена потребность стада */
while(total>0)
for(nt=0; nt<NT; nt++) {
/* получение очередной порции */
port=1000.*rand()/RAND_MAX;
/* передача порции в канал */
write(fdE[nt],&port,sizeof(long));
/* уменьшение общей потребности */
total-=port;
/* задержка на поиск следующей порции */
usleep((int)(1000.*rand()/RAND_MAX));
if (total<0) break;
}
sleep(20);
printf("%s ВРЕМЯ ОЖИДАНИЯ ИСТЕКЛО\n",curtime());
fdG=open(gFname,O_RDONLY);
sleep(3);
int cc=0;
for(;;) {
/* чтение 1-й буквы очередного доклада */
cc=read(fdG,mess,1);
/* если конец данных в канале - конец приема докладов */
if (cc<=0) {break;}
/* чтение из канала строки с именем Политикана */
for (i=1;;i++) {
cc=read(fdG,mess+i,1);
if (mess[i]==0) break;
}
/* поиск Политикана по имени */
for (nt=0; nt<NT; nt++)
if (!strcmp(mess,mtr[nt].tr->name)) break;
printf("%s Предвыборная программа политикана %s готова\n",curtime(),mtr[nt].tr->name);
/* отметка о завершении */
mtr[nt].status=1;
}
/* перебор списка Политиканов */
for (nt=0; nt<NT; nt++) {
/* тем, кто не доложил о завершении посылается SIGKILL */
if (mtr[nt].status!=1) kill(mtr[nt].chpid,SIGKILL);
/* Монитор убеждается в завершении Политикана */
waitpid(mtr[nt].chpid,&s,0);
/* Сообщение о гибели, если Политикан закончился с ненулевым кодом */
if (s) printf("%s Политикан %s не смог подготовить программу (%d)\n",
curtime(),mtr[nt].tr->name,s);
/* закрытие и уничтожение каналов */
close(fdE[nt]);
unlink(mtr[nt].tr->name);
}
close(fdG);
unlink(gFname);
}
Нижче приводиться приклад виконання цієї моделі
23:02:13.403 Грузовик Freightliner началась загрузка. Путь - 4535, приоритет - 0
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.