Розрахунок програмного модуля (Звіт з лабораторної роботи № 3 з дисципліни "Операційні системи"), страница 2

    #include <stdio.h>

    #include <stdlib.h>

    #include <unistd.h>

    #include <sys/types.h>

    #include <sys/wait.h>

    #include <sys/time.h>

    #include <time.h>

    #include <signal.h>

    #include <sys/resource.h>

    #include "../truck.h"

    #include "../base.h"

    #include "../curtime.c"

    /*               файл incl_dcl.c                 */

    /* Структура, що описує вантажівку в моніторі:

       містить особисті дані вантажівка й керуючу

       інформацію про нього */

    struct mtruck{

       struct truck *el;     /* покажчик на особисті дані */

       pid_t          chpid; /* ID процесу */

       int            prty;  /* пріоритет процесу */

       char           status; /* стан процесу */

    };

    static int nt;                   /* параметр циклів */

    static struct mtruck mtr[NT];    /* керуюча інформація про вантажівки */

    static int cnt;                  /* число запущених вантажівок */

    static char chld_name[]="./truck1";

    /*-і-і-і-і-і-і-і-і-і-і-і-і-і-і-і-і-і-і-і-і-і-і-і-і-і-і*/

    main()

    {

       /*               файл incl_dc2.c                 */

       int    stat;  /* стан процесу при завершенні */

       /* рядка для символьного подання параметрів */

       char   t1[20], t2[20], t3[20], t4[20];

       pid_t pw;   /* ідентифікатор процесу */

       char   eee[512];   /* текст повідомлення про помилку */

       /*               файл incl_bgn.c                 */

       /* початок роботи */

       /* ініціалізація генератора випадкових чисел */

       srand(time(NULL));

       printf("%s - Початок роботи\n",curtime());

       *t3=*t4=0;

       /* цикл по масиві вантажівок */

       for (nt=0; nt<NT; nt++)

       {

               /*               файл incl_str.c                 */

               /* апись особистих даних у керуючу інформацію */

               mtr[nt].el=&et[nt];

               /* педставление нестрокових даних у строковому виді */

               sprintf(t1,"%d",mtr[nt].el->power);

               sprintf(t2,"%lf",mtr[nt].el->weight);

               /*               файл incl_cal.c                 */

               /* породження процесу */

               pw=fork();

               if (pw==0)

               {

                      /* для дочірнього процесу - запуск програми-вантажівки */

                      /* особисті дані передаються через параметри */

                      if(execl(chld_name,mtr[nt].el->name,t1,t2,t3,t4,NULL)<0)

                      {

                              /*     якщо завантаження програми-вантажівки або не вдалася,

                                     друкується повідомлення про помилку, і процес завершується */

                              perror(eee);

                              printf("%s\n",eee); exit(0);

                      }

                      /*     якщо виклик execl виконався успішно, те далі в

                              дочірньому процесі виконується програма elephant1 */

               }

               /* ця частина - тільки для процесу - Ктулху */

               /* заповнення керуючої інформації про процес  */

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

               mtr[nt].status=-1;

               /* установка випадкової добавки до пріоритету */

               mtr[nt].prty=(int)(10.* rand()/RAND_MAX);

               setpriority(PRIO_PROCESS,pw,mtr[nt].prty);

               /* запам'ятовування ID процесу-вантажівки */

               mtr[nt].chpid=pw;

       }

       /*               файл incl_chk.c                 */

       /* пауза, щоб процеси встигли завантажити вантажівок */

       sleep(2);

       /* перебір запущених процесів */

       for (cnt=nt=0; nt<NT; nt++)

       {

               /* перевірка - чи не закінчився процес */

               pw=waitpid(mtr[nt].chpid,&stat,WNOHANG);

               if (pw==mtr[nt].chpid)

               {

                      /* якщо процес закінчився, виходить, запуск вантажівки не вдався */

                      printf("Вантажівка %s не запущений\n",mtr[nt].el->name);

               }

               else

               {

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

                      mtr[nt].status=0;

                      /* підрахунок запущених вантажівок */

                      cnt++;

               }

       }

       /* якщо лічильник запущених 0 - завершення Ктулху */

       if(!cnt)

       {

               exit(0);

       }

       /* пауза монітора, вантажівки в цей час виконуються */

       sleep(20);

       printf("%s - ЧАС ОЧІКУВАННЯ МИНУЛО\n",curtime());

       /* перебір всіх запущених вантажівок */

       for (nt=0; nt<NT; nt++)

       {      /* якщо стан процесу "не запущений", він не перевіряється */

               if(mtr[nt].status<0)

               {

                      continue;

               }