Создание программного комплекса для повышения доступности и отказоустойчивости информационной системы, разрабатываемой на предприятии ЗАО "Компания РОС"
Разработка программного комплекса и описание алгоритма. Разработка пользовательского интерфейса. Анализ тестовых испытаний программного блока. Защита пользователей от воздействия на них опасных и вредных факторов. Режимы работы программного комплекса.
Рубрика | Программирование, компьютеры и кибернетика |
Вид | дипломная работа |
Язык | русский |
Дата добавления | 14.03.2013 |
Размер файла | 1,7 M |
Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже
Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
Переназначение центра:
Для переназначения центра необходимо выполнить следующую команду:
> ./floatcenter -change <ИМЯ_УЗЛА>
1.7.5 Сообщения оператору
В процессе работы программного комплекса могут выдаваться диагностические сообщения о некорректной работе программного комплекса (ошибках), которые необходимо передать разработчику.
Основными же сообщения оператору являются:
1. Сообщение о недостаточных правах на чтение\запись в файл журнала;
2. Сообщение о недостаточных правах на чтение файла параметров;
3. Сообщения, подтверждающие выполнение команды (рисунок 1.7.5.1).
Рисунок 1.7.5.1. - Подтверждение выполнения команды.
При попытке выполнить недопустимую команду, ее исполнение игнорируется.
2. Экологическая часть и безопасность жизнедеятельности
2.1 Исследование возможных опасных и вредных факторов, возникающих при работе с ЭВМ, и их воздействие на пользователей
Любой производственный процесс, в том числе и работа с вычислительной техникой, сопряжен с появлением опасных и вредных факторов.
Опасным называется фактор, воздействие которого на человека вызывает травму, то есть внезапное повреждение организма в результате воздействия внешних факторов.
Вредным называется фактор, длительное воздействие которого на человека, приводит к профессиональным заболеваниям. [17]
Факторы различаются в зависимости от источника возникновения.
2.1.1 Исследование возможных опасных и вредных факторов, возникающих при работе с ЭВМ
Питание ЭВМ производится от сети 220В. Так как безопасным для человека напряжением является напряжение 40В, то при работе на ЭВМ опасным фактором является поражение электрическим током.
В дисплее ЭВМ высоковольтный блок строчной развертки и выходного строчного трансформатора вырабатывает высокое напряжение до 25кВ для второго анода электронно - лучевой трубки. А при напряжении от 5 до 300 кВ возникает рентгеновское излучение различной жесткости, которое является вредным фактором при работе с ПЭВМ (при 15 - 25 кВ возникает мягкое рентгеновское излучение).
Развертка ЭЛТ создается напряжением с частотой:
85 Гц (кадровая развертка);
42 кГц (строчная развертка).
Следовательно, пользователь попадает в зону электромагнитного излучения низкой частоты, которое является вредным фактором.
Во время работы компьютера дисплей создает ультрафиолетовое излучение, при повышении плотности которого > 10 Вт/м2, оно становиться для человека вредным фактором. Его воздействие особенно сказывается при длительной работе с компьютером.
Во время работы компьютера вследствие явления статического электричества происходит электризация пыли и мелких частиц, которые притягивается к экрану.
Вывод:
При эксплуатации перечисленных элементов вычислительной техники могут возникнуть следующие опасные и вредные факторы:
поражение электрическим током;
рентгеновское излучение;
электромагнитное излучение;
ультрафиолетовое излучение;
статическое электричество.
2.1.2 Анализ влияния опасных и вредных факторов на пользователя
Влияние электрического тока
Электрический ток, воздействуя на человека, приводит к травмам. Такими травмами являются:
· Общие травмы:
судорожное сокращение мышц, без потери сознания;
судорожное сокращение мышц, с потерей сознания;
потеря сознания с нарушением работы органов дыхания и кровообращения;
состояние клинической смерти;
Местные травмы:
электрические ожоги;
электрический знак;
электро-автольмия.
Проходя через тело человека, электрический ток оказывает следующие воздействия:
термическое (нагрев тканей и биологической среды);
электролитическое (разложение крови и плазмы);
биологическое (способность тока возбуждать и раздражать живые ткани организма);
механическое (возникает опасность механического травмирования в результате судорожного сокращения мышц).
Наиболее опасным переменным током является ток 20 - 100 Гц. Так как компьютер питается от сети переменного тока частотой 50 Гц, то этот ток является опасным для человека. [18, 19]
Влияние рентгеновского излучения
В организме происходит:
торможение функций кроветворных органов;
нарушение нормальной свертываемости крови и т.д.
Влияние электромагнитных излучений низкой частоты
Электромагнитные поля с частотой 60 Гц и выше могут инициировать изменения в клетках животных (вплоть до нарушения синтеза ДНК). В отличие от рентгеновского излучения, электромагнитные волны обладают необычным свойством: опасность их воздействия при снижении интенсивности не уменьшается, мало того, некоторые поля действуют на клетки тела только при малых интенсивностях или на конкретных частотах. Оказывается переменное электромагнитное поле, совершающее колебания с частотой порядка 60 Гц, вовлекает в аналогичные колебания молекулы любого типа, независимо от того, находятся они в мозге человека или в его теле. Результатом этого является изменение активности ферментов и клеточного иммунитета, причем сходные процессы наблюдаются в организмах при возникновении опухолей.
Влияние ультрафиолетового излучения
Ультрафиолетовое излучение - электромагнитное излучение в области, которая примыкает к коротким волнам и лежит в диапазоне длин волн ~ 200 - 400 нм.
Различают следующие спектральные области:
200 - 280 нм - бактерицидная область спектра.
280 - 315 нм - Зрительная область спектра (самая вредная).
315 - 400 нм - Оздоровительная область спектра.
Синий люминофор экрана монитора вместе с ускоренными в электронно-лучевой трубке электронами являются источниками ультрафиолетового излучения. Воздействие ультрафиолетового излучения сказывается при длительной работе за компьютером. Основными источниками поражения являются глаза и кожа.
Энергетической характеристикой является плотность потока мощности [Вт/м2].
Биологический эффект воздействия определяется внесистемной единицей [эр]. 1 эр - это поток (280 - 315 нм), который соответствует потоку мощностью 1 Вт.
Воздействие ультрафиолетового излучения сказывается при длительной работе за компьютером. Максимальная доза облучения:
7,5 мэр·ч/м2 за рабочую смену;
60 мэр·ч/ м2 в сутки.
При длительном воздействии и больших дозах могут быть следующие последствия:
серьезные повреждения глаз (катаракта);
рак кожи;
кожно-биологический эффект (гибель клеток, мутация, канцерогенные накопления);
фототоксичные реакции.
Влияние статического электричества
Результаты медицинских исследований показывают, что электризованная пыль может вызвать воспаление кожи, привести к появлению угрей и даже испортить контактные линзы. Кожные заболевания лица связаны с тем, что наэлектризованный экран дисплея притягивает частицы из взвешенной в воздухе пыли, так, что вблизи него «качество» воздуха ухудшается и оператор вынужден работать в более запыленной атмосфере. Таким же воздухом он и дышит.
Особенно стабильно электростатический эффект наблюдается у компьютеров, которые находятся в помещении с полами, покрытыми синтетическими коврами.
При повышении напряженности поля Е > 15 кВ/м, статическое электричество может вывести из строя компьютер. [22]
Вывод:
Из анализа воздействий опасных и вредных факторов на организм человека следует необходимость защиты от них.
2.2 Способы защиты пользователей от воздействия на них опасных и вредных факторов
2.2.1 Методы и средства защиты от поражения электрическим током
В помещении вычислительного центра существует опасность прикосновения одновременно к предметам, имеющим соединения с землей, и металлическому корпусу электрооборудования.
Как основной способ борьбы с опасностью поражения электрическим током (от поражения напряжением прикосновения) используется зануление.
Зануление - это преднамеренное соединение нетоковедущих металлических частей, которые могут оказаться под напряжением в результате повреждения изоляции, с нулевым защитным проводником (применяется в трехфазных сетях с заземленной нейтралью в установках до 1000 вольт, см. рис. 2.1). [19]
Рисунок 2.1 - Защитное зануление
Для защиты используется нулевой защитный провод. В сеть вставляется предохранитель (автомат). Принцип защиты пользователей при занулении заключается в отключении сети за счет тока короткого замыкания, который вызывает перегорание предохранителя и отключает сеть.
При нормальном режиме работы сети ток, текущий через человека, можно рассчитать по формуле 2.1.
Iч = Uф/(Rч+r0) (2.1)
где Iч - ток, протекающий через человека [А];
Uф - фазовое напряжение (Uф = 220 В), [В];
Rч - сопротивление тела человека (Rч = 1000 Ом), [Ом];
r0 - сопротивление заземлителя (сопротивление обуви ~ 10 Ом), [Ом];
Так как r0 << Rч - следовательно, сопротивление заземлителя можно в расчет не брать. Получается, что практически все Uф применено к телу человека и, следовательно, получается по формуле 2.2:
Iч = Uф/Rч (2.2)
Iч = 220/1000 = 0,22 А
Допустимые значения приложенного напряжения и протекающего через человека тока соответственно равны 36 В и 0,006 А. Полученные же при расчете цифры горазда превосходят эти значения (220 В и 0,22 А).
Рассчитаем ток короткого замыкания (Iкз) по формуле 2.3 при срабатывании защитной схемы зануления и параметры предохранителя (Iном), используемого в схеме.
(2.3)
где Uф - фазное напряжение сети питания (Uф = 220 В), [В];
rТ - паспортная величина сопротивления обмотки трансформатора, (rТ = 0,312 Ом), [Ом].
Rобщ = r1 + r2 + r3 (2.4)
где (2.5)
? - удельное сопротивление нулевого защитного проводника (для меди ? = 0,0175 Ом·м), [Ом·м];
l - длина проводника, [м];
S - площадь поперечного сечения нулевого защитного проводника (S = 1 мм2), [мм2].
Возьмем l1 = 850 м, l2 = 150 м, l3 = 70 м;
r1 = 0,0175·850/1 = 14,875 Ом
r2 = 0,0175·150/1 =2,625 Ом
r3 = 0,0175·70/1 = 1,225 Ом
Rобщ = 14,875 Ом + 2,625 Ом + 1,225 Ом = 18,725 Ом
По величине Iкз определим, с каким Iном необходимо в цепь питания ЭВМ включать автомат.
, следовательно (2.6)
Где k - коэффициент, указывающий тип защитного устройства (в зависимости от типа автомата: k=3 для автомата с электромагнитным расщепителем).
Iном = 11,68 А / 3 = 3,9 А
Вывод:
Для отключения ПЭВМ от сети в случае короткого замыкания или других неисправностей в цепь питания ПЭВМ необходимо ставить автомат с Iном = 4 А. алгоритм программный пользователь интерфейс
2.2.2 Методы и средства защиты от рентгеновского излучения
Существует 3 основных способа защиты от рентгеновского излучения:
время (работа не более 4 часов);
расстояние (не менее 50 см от экрана);
экранирование.
Необходимо придерживаться строгого графика работы - время работы за компьютером не должно превышать половины рабочей смены (4 часа).
Для рентгеновского излучения - предельно допустимая доза для людей, которые постоянно или временно работают непосредственно с источником ионизирующих излучений не должна превышать D = 0,5 бэр/год в год.
Определим уровень мощности дозы на различных расстояниях от экрана монитора по формуле 2.7:
Рri = Р0·е-?·r (2.7)
гдеР0 - мощность дозы излучения на расстоянии 5 см от экрана, мкР/ч;
Prj - уровень мощности рентгеновского излучения на заданном расстоянии, мкР/ч;
r - расстояние от экрана, см;
? - коэффициент ослабления воздухом рентгеновских лучей, см-1.
Для расчета возьмем ? = 3,14·10-2 см-1.
Таблица 2.1 - Зависимость уровня мощности дозы от расстояния до источника
r, см |
5 |
10 |
30 |
40 |
50 |
60 |
|
Рrj, мкР/ч |
100 |
73 |
53 |
39 |
28 |
21 |
Принимая среднее расстояние между пользователем и монитором за 60 см и зная, что годовая доза рентгеновского излучения опасная для здоровья равна 0,5Р - можно рассчитать по формуле 2.8 реальную дозу радиации получаемую пользователем за год:
Dr = Di · n · n1 · n2 (2.8)
где Dr - доза радиации за год;
n - нормируемое ежедневное время работы за монитором равное 4ч;
n1 - количество рабочие дней в неделю (5 дней);
n2 - количество рабочих недель в году (в среднем 43 недели);
Di - мощность дозы рентгеновского излучения на расстоянии 60 cм;
Dr = 15,2 · 4 · 5 · 43 = 0,013Р (бэр).
0,013Р < 0,5Р (предельно допустимая доза 0,5Р значительно превосходит полученное значение дозы).
Вывод:
Оператору рекомендуется находиться от монитора на расстоянии не менее 60 см.
2.2.3 Методы и средства защиты от ультрафиолетового излучения
Для защиты от ультрафиолетового излучения:
защитный фильтр или специальные очки (толщина стекол 2мм, насыщенных свинцом);
одежда из фланели и поплина;
побелка стен и потолка (ослабляет на 45-50%).
мощность люминисцентных ламп не должна превышать 40 Вт
2.2.4 Методы и средства защиты от электромагнитных полей низкой частоты
Защита от электромагнитных излучений осуществляется временем, расстоянием, экранированием:
время работы - не более 4 часов;
расстояние - не менее 50 см от источника;
экранирование.
Относительно электромагнитных излучений низкой частоты можно отметить, что в современных мониторах нижний предел спектра смещен в сторону высоких частот посредством увеличения частоты кадровой развертки до 90 - 120Гц и значительно превышает наиболее опасную частоту - 60 Гц.
Чтобы уменьшить опасность надо:
не работать с открытой ЭВМ;
соблюдать расстояния между соседними ЭВМ (не < 1,5м)
исключить пребывание сбоку от монитора (? 1,2 м).
2.2.5 Методы и средства защиты от статического электричества
Электростатические поля вызывают скопление пыли, попадающей на лицо и глаза оператора.
Норма: 15 кВ/м.
Защита от статического электричества и вызванных им явлений осуществляется следующими способами:
наличие контурного заземления;
использование нейтрализаторов статического электричества;
скорость подвижного воздуха в помещении должна быть не более 0,2 м/с;
отсутствие синтетических покрытий;
ежедневная влажная уборка помещения вычислительного центра для уменьшения количества пыли;
проветривание без присутствия пользователя. [21,22]
Вывод:
Выбранные методы и способы защиты от опасных и вредных факторов обеспечивают защиту пользователей, работающих с вычислительной техникой.
2.3 Эргономические требования к рабочим местам пользователей
Выполнение эргономических рекомендаций по эксплуатации компьютеров позволяет значительно снизить вредные воздействия находящихся в эксплуатации ПЭВМ. В первую очередь безопасность при работе с ПЭВМ может быть обеспечена за счет рационального размещения компьютеров в помещениях, оптимальной с точки зрения эргономики организации рабочего дня пользователей, а также за счет применения средств повышения контраста изображения и защиты от бликов на экране, электромагнитных излучений и электростатического поля.
Рекомендации охватывают следующий круг вопросов:
· Требования к помещениям и оборудованию рабочих мест.
· Рекомендации по защите пользователей от излучений ПЭВМ.
2.3.1 Требования к помещениям, оборудованию рабочих мест и освещенности
Помещения должны иметь естественное и искусственное освещение. Желательна ориентация оконных проемов на север или северо-восток. Оконные проемы должны иметь регулируемые жалюзи или занавеси, позволяющие полностью закрывать оконные проемы. Занавеси следует выбирать одноцветные, гармонирующие с цветом стен, выполненные из плотной ткани и шириной в два раза больше ширины оконного проема. Для дополнительного звукопоглощения занавеси следует подвешивать в складку на расстоянии 15 ? 20 см от стены с оконными проемами. [18, 23]
Рабочие места по отношению к световым проемам должны располагаться так, чтобы естественный свет падал сбоку, преимущественно - слева.
Для устранения бликов на экране, также как чрезмерного перепада освещенности в поле зрения, необходимо удалять экраны от яркого дневного света.
Рабочие места должны располагаться от стен с оконными проемами на расстоянии не менее 1 м.
Освещенность на рабочем месте с ПЭВМ должна быть не менее 300 лк.
Поверхность пола в помещениях должна бать ровной, без выбоин, нескользкой, удобной для чистки и влажной уборки, обладать антистатическими свойствами. [20]
Рекомендуемый микроклимат в помещениях при работе с ПЭВМ:
температура 19 ? 21?С;
относительная влажность воздуха 55 ? 62%.
Площадь на одно рабочее место должна составлять примерно 6 м2 (объем - не меньше 20м3). Конструкция рабочего места пользователя ПЭВМ (при работе сидя) должна обеспечивать поддерживание оптимальной рабочей позы с такими эргономичными характеристиками:
ступня ног - на полу или на подставке для ног;
бедра - в горизонтальной плоскости;
предплечье - вертикально;
локти - под углом 70 - 90? к вертикальной плоскости;
запястья согнуты под углом не больше 20? относительно горизонтальной плоскости;
наклон головы - 15 - 20? относительно вертикальной плоскости;
монитор должен располагаться напротив глаз пользователя и на оптимальном расстоянии от них, но не ближе 60 см. [20,23,24]
2.3.2 Рекомендации по защите пользователей от излучений ПЭВМ
Если в помещении эксплуатируется более одного компьютера, то следует учесть, что на пользователя одного компьютера могут воздействовать излучения от других ПЭВМ, в первую очередь со стороны боковых и задних стенок дисплея. Учитывая, что от излучения со стороны экрана дисплея можно защититься применением специальных фильтров, необходимо, чтобы пользователь размещался от боковых и задних стенок других дисплеев на расстоянии не менее 1,5 м. [18]
На мониторы рекомендуется устанавливать защитные фильтры, обеспечивающие защиту от вредных воздействий монитора в электромагнитном спектре и позволяющие уменьшить блик от электронно-лучевой трубки, а также повысить читаемость символов.
2.4 Выводы
Соблюдение перечисленных методов и способов защиты от опасных и вредных факторов, а также соблюдение эргономических требований позволяют обеспечить полную безопасность пользователя при работе с вычислительной техникой.
Заключение
В результате проделанной работы был разработан программный комплекс для решения задачи повышения отказоустойчивости проектируемой информационной системы в оборонном, коммерческом и личном использовании.
Учитывая требования:
* программный комплекс должен реализовывать заданный механизм поддержания работоспособности информационной системы;
* программный комплекс должен обеспечивать автоматическую и ручную режимы работы;
* программный комплекс должен функционировать под управлением ОС на базе BSD 4.4;
* программный комплекс должен быть реализован на языке C++;
* программный комплекс должен обеспечивать функцию журналирования своей работы;
* работа программного комплекса должна быть прозрачна для пользователя.
Программный комплекс был внедрен в научно-исследовательскую деятельность ЗАО «Компания РОС» на этапе создания комплексного имитационно-моделирующего стенда.
Список использованной литературы
1. Статья “Кластер (группа компьютеров)” / Википедия: Свободная энциклопедия.-http://ru.wikipedia.org/wiki/%D0%9A%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80_(%D0%B3%D1%80%D1%83%D0%BF%D0%BF%D0%B0_%D0%BA%D0%BE%D0%BC%D0%BF%D1%8C%D1%8E%D1%82%D0%B5%D1%80%D0%BE%D0%B2)
2. Статья “Кластер (группа серверов)” / Википедия: Свободная энциклопедия.- http://ru.wikipedia.org/wiki/%D0%9A%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80_(%D0%B3%D1%80%D1%83%D0%BF%D0%BF%D0%B0_%D1%81%D0%B5%D1%80%D0%B2%D0%B5%D1%80%D0%BE%D0%B2)
3. Распределенные системы. Принципы и парадигмы / Э. Таненбаум, М. Ван Стеен. Спб.: Питер, 2009. - 877 с.
4. Технические страницы портала компании Microsoft. http://technet.microsoft.com/en-us/default.aspx
5. Официальная страница проекта Linux-HA. - http://www.linux-ha.org/
6. Джесс Либерти, Брэдли Джонс Освой самостоятельно C++ за 21 день.- М.: Вильямс, 2007.- 784 с.
7. Э. Таненбаум Компьютерные сети.- СПб.: Питер, 2007.- 992 с.
8. Официальный сайт компании Лидер computers. Статья Компьютерные сети.- М., http://www.leader-comp.ru/computer-network.html
9. Официальная страница проета FreeBSD - http://www.freebsg.org
10. Официальная страница проекта OpenNet - http://www.opennet.ru
11. Microsoft SQL Server 2000/ М.Ф.Гарсиа, Дж.Рединг, Э.Уолен, С.А.ДаЛюк - Спб: ЭКОМ, 2004 - 976 стр.
12. FreeBSD. Подробное руководство. Издание 2 / Майкл Лукас - Спб: Символ-Плюс, 2009г. - 864 стр.
13. ГОСТ 19.301-79 Программа и методика испытаний. Требования к содержанию и оформлению. - Введ. 01.01.81 - Группа Т55.
14. ГОСТ 19.505-79 Руководство оператора. Требования к содержанию и оформлению. - Введ. 01.01.80 - Группа Т55.
15. ГОСТ 19.201-78 Техническое задание. Требования к содержанию и оформлению. - Введ. 01.01.80 - Группа Т55.
16. ГОСТ 19.701-90 Схемы алгоритмов, программ данных и систем. - Введ. 01.01.92 - Группа Т5.
17. ГОСТ 12.0.003-86. Опасные и вредные производственные факторы.
18. Сибаров Ю. Г. и др. Охрана труда на ВЦ. М., 1989.
19. ГОСТ 12.1.030-81. Электробезопасность. Защитное заземление, зануление.
20. САНПиН-1340-03. Гигиенические требования к персональным ЭВМ и организации работы.
21. ГОСТ ССБТ 12.1.045-84. Электростатические поля. Допустимые условия на рабочем месте.
22. ГОСТ ССБТ 12.1.124-84. Средства защиты от статического электричества.
23. ФЗ РФ №181. 1999 г. «Об основах охраны труда в РФ».
24. Трудовой кодекс РФ
Приложение 1
Текст программы
Головной модуль
#include "../conf/config.h"
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <sys/wait.h>
#include <../classes/cmessenger.h>
class CBrain: public IMessenger {
public:
CBrain();
void FuncOnMsgRcv(Message msg);
void OnStoppingAll();
void Init();
~CBrain();
private:
int voice_pid, ear_pid, nose_pid, finger_pid, head_pid;
CMessenger *messenger;
int ppid;
bool stopping_all;
int p_started;
};
#include "cbrain.h"
CBrain::CBrain()
{
nose_pid = 2;
ear_pid = 2;
voice_pid = 2;
head_pid = 2;
ppid = getpid();
stopping_all = false;
p_started = 0;
printf("---=== Welcome to BRAIN ===---\n");
printf("Starting services...\n");
printf("BRAIN PID=%d\n",ppid);
printf("Starting voice...\n");
voice_pid = fork();
if (voice_pid < 0) {
perror("Brain: error calling fork()");
return;
} else if (voice_pid == 0) {
if (execl(VOICE_EXE, NULL) < 0) {
perror("Brain: error calling execl()");
}
}
printf("VOICE PID=%d\n",voice_pid);
printf("Starting ear...\n");
ear_pid = fork();
if (ear_pid < 0) {
perror("Brain: error calling fork()");
return;
} else if (ear_pid == 0) {
if (execl(EAR_EXE, NULL) < 0) {
perror("Brain: error calling execl()");
}
}
printf("EAR PID=%d\n",ear_pid);
printf("Starting nose...\n");
nose_pid = fork();
if (nose_pid < 0) {
perror("Brain: error calling fork()");
return;
} else if (nose_pid == 0) {
if (execl(NOSE_EXE, NULL) < 0) {
perror("Brain: error calling execl()");
}
}
printf("NOSE PID=%d\n",nose_pid);
printf("Starting finger...\n");
finger_pid = fork();
if (finger_pid < 0) {
perror("Brain: error calling fork()");
return;
} else if (finger_pid == 0) {
if (execl(FINGER_EXE, NULL) < 0) {
perror("Brain: error calling execl()");
}
}
printf("FINGER PID=%d\n",finger_pid);
printf("---=== Log of IPC ===---\n");
messenger = new CMessenger();
}
void CBrain::OnStoppingAll()
{
if (p_started == 0) {
messenger->stoplisten();
}
}
void CBrain::Init()
{
messenger->setExObjOnMsgRcv(this);
messenger->startlisten();
}
void CBrain::FuncOnMsgRcv(Message msg)
{
int pid;
int status;
switch (msg.datab.cmd) {
case CMD_STOP_ALL:
messenger->sendmessage(finger_pid, CMD_FINGER_STOP);
sleep(1);
messenger->sendmessage(nose_pid, CMD_NOSE_STOP);
messenger->sendmessage(ear_pid, CMD_EAR_STOP);
messenger->sendmessage(voice_pid, CMD_VOICE_STOP);
stopping_all = true;
break;
case SAY_STARTED:
bcopy(&msg.datab.data, &pid, msg.datab.size);
printf("%d : PID = %d : Started!\n", msg.datab.pid, pid);
p_started++;
break;
case SAY_PAUSED:
bcopy(&msg.datab.data, &pid, msg.datab.size);
printf("%d : PID = %d : Paused!\n", msg.datab.pid, pid);
break;
case SAY_CONTINUED:
bcopy(&msg.datab.data, &pid, msg.datab.size);
printf("%d : PID = %d : Continued!\n", msg.datab.pid, pid);
break;
case SAY_STOPPED:
bcopy(&msg.datab.data, &pid, msg.datab.size);
printf("%d : PID = %d : Stopped!\n", msg.datab.pid, pid);
p_started--;
if (stopping_all)
OnStoppingAll();
break;
case CMD_NOSE_CONTINUE:
messenger->sendmessage(nose_pid, CMD_NOSE_CONTINUE);
break;
case CMD_NOSE_PAUSE:
messenger->sendmessage(nose_pid, CMD_NOSE_PAUSE);
break;
case CMD_NOSE_STOP:
messenger->sendmessage(nose_pid, CMD_NOSE_STOP);
wait(&status);
break;
case CMD_VOICE_CONTINUE:
messenger->sendmessage(voice_pid, CMD_VOICE_CONTINUE);
break;
case CMD_VOICE_PAUSE:
messenger->sendmessage(voice_pid, CMD_VOICE_PAUSE);
break;
case CMD_VOICE_STOP:
messenger->sendmessage(voice_pid, CMD_VOICE_STOP);
wait(&status);
break;
case CMD_EAR_CONTINUE:
messenger->sendmessage(ear_pid, CMD_EAR_CONTINUE);
break;
case CMD_EAR_PAUSE:
messenger->sendmessage(ear_pid, CMD_EAR_PAUSE);
break;
case CMD_EAR_STOP:
messenger->sendmessage(ear_pid, CMD_EAR_STOP);
wait(&status);
break;
case CMD_FINGER_CONNECT:
messenger->sendmessage(finger_pid, CMD_FINGER_CONNECT, msg.datab.data, msg.datab.size);
break;
case CMD_FINGER_RECONNECT:
messenger->sendmessage(finger_pid, CMD_FINGER_RECONNECT, msg.datab.data, msg.datab.size);
break;
case CMD_FINGER_DISCONNECT:
messenger->sendmessage(finger_pid, CMD_FINGER_DISCONNECT);
break;
case CMD_FINGER_STOP:
messenger->sendmessage(finger_pid, CMD_FINGER_STOP);
wait(&status);
break;
case INFO_EAR_SOMEBODY_HAS_BIGGER_WEIGHT:
messenger->sendmessage(nose_pid, CMD_NOSE_CONNECT_CLIENTS_TO_ANOTHER_SERVER, msg.datab.data, msg.datab.size);
messenger->sendmessage(nose_pid, CMD_NOSE_PAUSE);
messenger->sendmessage(ear_pid, CMD_EAR_PAUSE);
messenger->sendmessage(voice_pid, CMD_VOICE_PAUSE);
messenger->sendmessage(head_pid, CMD_HEAD_BECOME_PASSIVE, msg.datab.data, msg.datab.size);
break;
case INFO_FINGER_SERVER_LOST:
messenger->sendmessage(nose_pid, CMD_NOSE_CONTINUE);
messenger->sendmessage(ear_pid, CMD_EAR_CONTINUE);
messenger->sendmessage(voice_pid, CMD_VOICE_CONTINUE);
messenger->sendmessage(head_pid, CMD_HEAD_BECOME_ACTIVE);
break;
}
}
CBrain::~CBrain()
{
messenger->deletequeue();
delete messenger;
}
#include "cbrain.h"
int main(int argc, char *argv[])
{
CBrain* brain = new CBrain();
brain->Init();
delete brain;
return 0;
}
Модуль широковещательной рассылки информации:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <../conf/config.h>
#include <sys/wait.h>
#include <signal.h>
#include <../interfaces/ibroadcastserver.h>
class CBroadcastServer{
public:
CBroadcastServer(int port);
void startlisten();
void stoplisten();
void messagereceived(char* msg, int len);
void SetExObjOnMsgReceived(IBroadcastServer* lExObjOnMsgReceived);
~CBroadcastServer();
private:
int sock;
int cpid;
struct sockaddr_in sa;
IBroadcastServer* ExObjOnMsgReceived;
};
#include "cbroadcastserver.h"
CBroadcastServer::CBroadcastServer(int port)
{
sa.sin_addr.s_addr = INADDR_ANY;
sa.sin_port = htons(BROADCAST_PORT);
cpid = -1;
}
void CBroadcastServer::SetExObjOnMsgReceived(IBroadcastServer* lExObjOnMsgReceived)
{
ExObjOnMsgReceived = lExObjOnMsgReceived;
}
void CBroadcastServer::messagereceived(char* msg, int len)
{
ExObjOnMsgReceived->FuncOnMsgReceived(msg, len);
}
void CBroadcastServer::startlisten()
{
int optval = 1;
sock = socket(PF_INET,SOCK_DGRAM,IPPROTO_UDP);
if (setsockopt(sock, SOL_SOCKET, SO_BROADCAST, &optval, sizeof optval) == -1) {
perror("CBroadcastServer: Error calling setsockopt()");
return;
}
if (bind(sock,(struct sockaddr *)&sa, sizeof(struct sockaddr)) != 0) {
perror("CBroadcastServer: Error calling bind()");
return;
}
cpid = fork();
if (cpid < 0) {
perror("CBroadcastServer: Error calling fork()");
return;
} else if (cpid == 0) {
while (1) {
char msg[MAX_MSG_SIZE];
int recsize;
socklen_t fromlen;
fromlen = sizeof(sa);
if ((recsize = recvfrom(sock, (void *)msg, MAX_MSG_SIZE, 0, (struct sockaddr *)&sa, &fromlen)) < 0) {
perror("CBroadcastServer: Error calling recvfrom()");
return;
}
messagereceived(msg, recsize);
}
}
}
void CBroadcastServer::stoplisten()
{
if (cpid > 0) {
kill(cpid, SIGHUP);
int status;
wait(&status);
close(sock);
}
cpid = -1;
}
CBroadcastServer::~CBroadcastServer()
{
stoplisten();
}
Модуль обслуживания сообщений:
#include "../conf/config.h"
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <strings.h>
#include <unistd.h>
#define CMD_STOP_ALL 0
#define SAY_STARTED 1
#define SAY_PAUSED 2
#define SAY_CONTINUED 3
#define SAY_STOPPED 4
#define CMD_VOICE_CONTINUE 10
#define CMD_VOICE_PAUSE 11
#define CMD_VOICE_STOP 12
#define CMD_EAR_CONTINUE 20
#define CMD_EAR_PAUSE 21
#define CMD_EAR_STOP 22
#define INFO_EAR_SOMEBODY_HAS_BIGGER_WEIGHT 200
#define CMD_NOSE_CONTINUE 30
#define CMD_NOSE_PAUSE 31
#define CMD_NOSE_STOP 32
#define CMD_NOSE_CONNECT_CLIENTS_TO_ANOTHER_SERVER 300
#define INFO_NOSTRILL_CLIENT_LOST 350
#define CMD_NOSTRILL_DISCONNECT 360
#define CMD_NOSTRILL_SENDDATA 361
#define CMD_FINGER_CONNECT 40
#define CMD_FINGER_DISCONNECT 41
#define CMD_FINGER_RECONNECT 42
#define CMD_FINGER_STOP 43
#define INFO_FINGER_SERVER_LOST 400
#define INFO_FINGER_CONNECT 401
#define INFO_FINGER_DISCONNECT 402
#define CMD_HEAD_CONTINUE 50
#define CMD_HEAD_PAUSE 51
#define CMD_HEAD_STOP 52
#define CMD_HEAD_BECOME_ACTIVE 500
#define CMD_HEAD_BECOME_PASSIVE 501
#include <../interfaces/imessenger.h>
class CMessenger{
public:
CMessenger();
void startlisten();
void startlisten(int pid);
void stoplisten();
void messagereceived(Message msg);
void sendmessage(long lcmd);
void sendmessage(long lcmd, char* data, int data_sz);
void sendmessage(int pid, long lcmd, void* data, int data_sz);
void sendmessage(int pid, long lcmd);
void setExObjOnMsgRcv(IMessenger* lExObjOnMsgRcv);
void deletequeue();
~CMessenger();
private:
int msgid;
bool cont;
IMessenger* ExObjOnMsgRcv;
};
#include "cmessenger.h"
CMessenger::CMessenger()
{
key_t key;
if ((key = ftok(KEY_FILE, 'A')) < 0) {
perror("CMessenger: error calling ftok()");
return;
}
if ((msgid = msgget(key, 0666 | IPC_CREAT)) < 0) {
perror("CMessenger: error calling msgget()");
return;
}
cont = false;
ExObjOnMsgRcv = NULL;
}
void CMessenger::setExObjOnMsgRcv(IMessenger* lExObjOnMsgRcv)
{
ExObjOnMsgRcv = lExObjOnMsgRcv;
}
void CMessenger::startlisten()
{
Message msg;
msg.mtype = BRAIN_MSG_ID;
cont = true;
while (cont) {
if (msgrcv(msgid, &msg, sizeof(msg), msg.mtype, 0) < 0) {
perror("CMessenger: error calling msgrcv()");
return;
}
messagereceived(msg);
}
return;
}
void CMessenger::startlisten(int pid)
{
Message msg;
msg.mtype = pid;
cont = true;
while (cont) {
if (msgrcv(msgid, &msg, sizeof(msg), msg.mtype, 0) < 0) {
perror("CMessenger: error calling msgrcv()");
return;
}
messagereceived(msg);
}
return;
}
void CMessenger::stoplisten()
{
cont = false;
return;
}
void CMessenger::messagereceived(Message msg)
{
if (ExObjOnMsgRcv != NULL) {
ExObjOnMsgRcv->FuncOnMsgRcv(msg);
}
}
void CMessenger::sendmessage(long lcmd)
{
Message msg;
msg.mtype = BRAIN_MSG_ID;
msg.datab.cmd = lcmd;
bzero(msg.datab.data, MAX_MSG_DATA_SIZE);
msg.datab.size = 0;
msg.datab.pid = getpid();
if (msgsnd(msgid, (void *)&msg, sizeof(msg.datab), 0) !=0) {
perror("CMessenger: Error calling msgsnd()");
return;
}
return;
}
void CMessenger::sendmessage(long lcmd, char* data, int data_sz)
{
Message msg;
msg.mtype = BRAIN_MSG_ID;
msg.datab.cmd = lcmd;
msg.datab.size = data_sz;
msg.datab.pid = getpid();
if (msg.datab.size > MAX_MSG_DATA_SIZE) {
perror("CMessenger: Error trying to send message: data to send is too large!");
return;
}
bcopy(data, msg.datab.data, data_sz);
if (msgsnd(msgid, (void *)&msg, sizeof(msg.datab), 0) !=0) {
perror("CMessenger: Error calling msgsnd()");
return;
}
return;
}
void CMessenger::sendmessage(int pid, long lcmd, void* data, int data_sz)
{
Message msg;
msg.mtype = pid;
msg.datab.cmd = lcmd;
msg.datab.size = data_sz;
msg.datab.pid = getpid();
if (msg.datab.size > MAX_MSG_DATA_SIZE) {
perror("CMessenger: Error trying to send message: data to send is too large!");
return;
}
bcopy(data, msg.datab.data, data_sz);
if (msgsnd(msgid, (void *)&msg, sizeof(msg.datab), 0) !=0) {
perror("CMessenger: Error calling msgsnd()");
return;
}
return;
}
void CMessenger::sendmessage(int pid, long lcmd)
{
Message msg;
msg.mtype = pid;
msg.datab.cmd = lcmd;
bzero(msg.datab.data, MAX_MSG_DATA_SIZE);
msg.datab.size = 0;
msg.datab.pid = getpid();
if (msgsnd(msgid, (void *)&msg, sizeof(msg.datab), 0) !=0) {
perror("CMessenger: Error calling msgsnd()");
return;
}
return;
}
void CMessenger::deletequeue()
{
if (msgctl(msgid, IPC_RMID, 0) < 0) {
perror("CMessenger: error calling msgctl()");
return;
}
}
CMessenger::~CMessenger()
{
}
Размещено на Allbest.ru
Подобные документы
Описание алгоритмов работы программного блока, тестирования, сохранения результатов, просмотра статистики и построения графика. Разработка пользовательского интерфейса. Анализ тестовых испытаний программного блока. Руководство оператора. Охрана труда.
дипломная работа [4,4 M], добавлен 06.03.2013Математическая модель радиолокационной обстановки. Разработка структуры программного комплекса и алгоритмов работы программного комплекса. Анализ опасных и вредных производственных факторов. Сетевое планирование и смета затрат на проведение работ.
дипломная работа [1,3 M], добавлен 26.03.2009Проектирование структуры информационной базы и разработка программного комплекса, позволяющего автоматизировать процесс учета налогоплательщиков. Разработка конфигурации и создание интерфейса базы данных, форм и отчетов в программе "1С Предприятие".
дипломная работа [3,2 M], добавлен 21.06.2015Разработка программного обеспечения для автоматизированной системы калибровки и поверки комплекса технических средств ПАДК "Луг-1". Аналитический обзор аналогов. Проектирование пользовательского интерфейса. Средства разработки программного обеспечения.
дипломная работа [1,4 M], добавлен 17.12.2014Структурная диаграмма программного модуля. Разработка схемы программного модуля и пользовательского интерфейса. Реализация программного модуля: код программы; описание использованных операторов и функций. Вид пользовательской формы с заполненной матрицей.
курсовая работа [215,3 K], добавлен 01.09.2010Современное планирование и управление информационными ресурсами предприятия. Интеграция организаций на базе информационных технологий. Разработка программного комплекса "ФОЛИО-КУПЕЦ". Задачи, решаемые применением корпоративной информационной системы.
курсовая работа [93,2 K], добавлен 12.10.2013Общая характеристика автоматизированной системы мониторинга и учета электроэнергии на фидерах контактной сети. Сравнение с современными автоматизированными системами коммерческого учета электроэнергии. Разработка модели и алгоритма программного комплекса.
дипломная работа [2,0 M], добавлен 28.06.2015Выбор базовых программных средств для разработки оригинального программного обеспечения. Компоненты программно-методического комплекса проектирования токарных операций. Программное обеспечение для организации интерфейса программно-методического комплекса.
дипломная работа [2,8 M], добавлен 14.05.2010Общие сведения о миномётах, их конструкция, боевые качества и классификация. Структурное построение обучающих программ, их алгоритмы. Жизненные циклы программного продукта. Реализация функционирования программы и разработка пользовательского интерфейса.
курсовая работа [1,2 M], добавлен 06.11.2012Аналитический обзор видеосистем с элементами интеллектуальной обработки видеоконтента: FaceInspector, VideoInspector Xpress. Разработка алгоритма организации вычислительных средств комплекса, в структуру поэтапного решения задачи анализа видеообъекта.
дипломная работа [3,4 M], добавлен 14.06.2012