/* установка обработчика сигналов */
signal(SIGUSR1,usrHandler);
signal(SIGUSR2,usrHandler);
*t3=*t4=0;
/* цикл по массиву Грузовиков */
for (nt=0; nt<NT; nt++) {
#include "../incl_str.c"
#include "../incl_cal.c"
}
#include "../incl_chk.c"
/* пауза монитора, Грузовики в это время выполняются */
sleep(20);
printf("%s ВРЕМЯ ОЖИДАНИЯ ИСТЕКЛО\n",curtime());
/* перебор всех запущенных Грузовиков */
for (nt=0; nt<NT; nt++) {
/* если состояние процесса "не запущен", он не проверяется */
if (mtr[nt].status<0) continue;
/* проверка завершения Грузовика с заданным ID, без ожидания завершения */
pw=waitpid(mtr[nt].chpid,&stat,WNOHANG);
if (mtr[nt].chpid==pw) {
/* если Грузовик завершился - сообщение о его успешном завершении */
printf("%s Грузовик %s нормально завершился\n",
curtime(),mtr[nt].tr->name);
cnt--;
}
else {
/* если Грузовик не завершился, ему посылается сигнал USR1 */
if (kill(mtr[nt].chpid,SIGUSR1)==0) {
/* ожидание обработки ответного сигнала */
while (!mtr[nt].status);
kill(mtr[nt].chpid,SIGTERM);
printf("%s Грузовику %s послан SIGTERM\n",curtime(),mtr[nt].tr->name);
}
else cnt--;
}
}
while (cnt) {
pw=wait(&stat);
for (nt=0; nt<NT; nt++) if (pw==mtr[nt].chpid) break;
if (stat)
printf("%s Грузовик %s разбился\n",curtime(),mtr[nt].tr->name);
else
printf("%s Грузовик %s нормально завершился \n",
curtime(),mtr[nt].tr->name);
cnt--;
}
}
/**********************************************/
/* Пример для работы N2 */
/**********************************************/
/* Дочерний процесс,
моделирующий поведение Грузовика*/
/**********************************************/
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/time.h>
#include <time.h>
#include <sys/resource.h>
#include <signal.h>
#include "../a0wait.c"
#include "../a1wait.c"
#include "../curtime.c"
#include "../truck.h"
static struct truck this;
static int thisState;
/* обработчик сигнала SIGUSR1 */
void usr1Handler(int sig_num) {
if (!thisState) kill(getppid(),SIGUSR1);
else kill(getppid(),SIGUSR2);
}
/* обработчик сигнала SIGTERM */
void termHandler(int sig_num) {
if ( !thisState || (waitFactor>1000) ) exit(8);
else
printf("%s Грузовик %s получил ещё немного времени на доставку (%d)\n",
curtime(),this.name,waitFactor);
}
main(int an, char *av[]) {
int need;
int opt;
/* установка обработчика сигнала SIGUSR1 */
signal(SIGUSR1,usr1Handler);
signal(SIGTERM,termHandler);
#include "../incl_tr1.c"
#include "../incl_t2.c"
#include "../incl_t3.c"
exit(0);
}
Нижче приводиться приклад виконання цієї моделі
20:39:37.864 Начало работы
20:39:37.866 - Грузовик Freightliner загрузку начал, приоритет=0
20:39:37.870 - Грузовик International загрузку начал, приоритет=0
20:39:37.874 - Грузовик Mack загрузку начал, приоритет=0
20:39:37.894 - Грузовик Peterbilt загрузку начал, приоритет=0
20:39:37.898 - Грузовик Kenuorth загрузку начал, приоритет=0
20:39:37.910 - Грузовик Volvo загрузку начал, приоритет=0
20:39:37.975 - Грузовик Sterling загрузку начал, приоритет=0
20:39:37.978 - Грузовик Western_Star загрузку начал, приоритет=0
20:39:43.422 - Грузовик International закончил погрузку
20:39:44.744 - Грузовик Mack закончил погрузку
20:39:44.914 - Грузовик Peterbilt закончил погрузку
20:39:48.712 - Грузовик Sterling закончил погрузку
20:39:51.518 - Грузовик Freightliner закончил погрузку
20:39:53.296 - Грузовик Volvo закончил погрузку
20:39:54.207 - Грузовик Western_Star закончил погрузку
20:39:55.210 - Грузовик Peterbilt доставил товар
20:39:56.564 - Грузовик Mack доставил товар
20:39:56.657 - Грузовик International доставил товар
20:39:57.722 - Грузовик Freightliner доставил товар
20:39:58.536 - Грузовик Sterling доставил товар
20:39:59.034 ВРЕМЯ ОЖИДАНИЯ ИСТЕКЛО
20:39:59.035 Грузовик Freightliner нормально завершился
20:39:59.035 Грузовик International нормально завершился
20:39:59.035 Грузовик Mack нормально завершился
20:39:59.035 Грузовик Peterbilt нормально завершился
20:39:59.135 - Грузовик Western_Star доставил товар
20:39:59.284 - Грузовик Kenuorth закончил погрузку
20:39:59.434 Грузовику Kenuorth послан SIGTERM
20:39:59.538 Грузовик Kenuorth получил ещё немного времени на доставку (169)
20:39:59.743 Грузовику Volvo послан SIGTERM
20:39:59.743 Грузовик Sterling нормально завершился
20:39:59.743 Грузовик Western_Star нормально завершился
20:39:59.847 Грузовик Volvo разбился
20:40:00.501 - Грузовик Kenuorth доставил товар
20:40:00.502 Грузовик Kenuorth нормально завершился
Висновок: засвоїв способи використання сигналів для синхронізації процесів.
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.