Засвоєння іменованих програмних каналів як засобу обміну даними між процесами, страница 3

               /* эта часть - только для процесса - Монитора */

               /* заполнение управляющей информации о процессе  */

               /* состояние процесса пока что - не запущен */

               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