#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;
}
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.