13 / 13 / 1
Регистрация: 19.10.2019
Сообщений: 607
|
|||||||||||
1 | |||||||||||
Watchdog на основе таймеров POSIX29.12.2019, 22:41. Показов 7536. Ответов 65
Метки нет (Все метки)
Добрый день, решил написать watchdog для сервера и чтобы не тратить зазря процессрное время решил реализовать это на основе таймеров POSIX, а не через создание отдельного потока.
Почитал документацию и остались некоторые вопросы: 1)Как должна быть организована проверка что сигнал пришёл от созданного мною таймера, а не от стороннего приложения ? Сечас в обработчик приходит _si->si_pid == 0 2)Как сделать сброс таймера т.е. чтоб начинал считать по новому ? это всётаки watchdog. 3)Как подружить мой watchdog и std::getline(cin, str_command ? 4)Надо ли вызывать предыдущие обработчики если я их не создавал ? 5)Надо ли делать задержку после вызова timer_settime ? 6)Какой тип таймера выбрать ? CLOCK_REALTIME меня смущает что ктото мжет перевести время. код внизу watchdog.cpp
0
|
29.12.2019, 22:41 | |
Ответы с готовыми решениями:
65
WatchDog Пробуждение по watchdog WatchDog в Python Watchdog из Arduino |
6579 / 4564 / 1843
Регистрация: 07.05.2019
Сообщений: 13,726
|
|
30.12.2019, 11:39 | 2 |
Через создание потока как то проще будет, раз в десять. И процессорное время тратиться зазря не будет - таймеры они тоже не в сферическом вакууме работают.
0
|
13 / 13 / 1
Регистрация: 19.10.2019
Сообщений: 607
|
|
30.12.2019, 17:07 [ТС] | 3 |
Хлчется получить ответ хотябы на три наиболее важных вопроса:
4)Надо ли вызывать предыдущие обработчики если я их не создавал ? 5)Надо ли делать задержку после вызова timer_settime ? 6)Какой тип таймера выбрать ? CLOCK_REALTIME меня смущает что ктото мжет перевести время. С остальным както можно найти обходные пути. Ну так речь идёт о watchdog-е, а не о простом таймере.
0
|
13 / 13 / 1
Регистрация: 19.10.2019
Сообщений: 607
|
|
31.12.2019, 07:18 [ТС] | 4 |
Появились новые вопросы.
1)Выбрасывают ли функции POSIX исключения ? Вроде это всётаки набор Си библиотек, но я до конца не уверен 2)Что будет если в обработчик сигнала добавить обработчик исключения или ещё хуже в обработчика сигнала ()без обработки исключений ) будет выброшено исключение ?
0
|
18896 / 9854 / 2410
Регистрация: 30.01.2014
Сообщений: 17,297
|
|
31.12.2019, 14:58 | 5 |
Что значит подружить?
CLOCK_MONOTONIC Речь о С++ исключениях? Нет. Из обработчика сигнала можно делать весьма ограниченное число операций. Вот их перечень: http://man7.org/linux/man-page... ety.7.html. Т.е. вы не можете в обработчике сигнала запрашивать, например, динамическую память. Исключений C++, естественно, в нем тоже не должно быть. Поэтому предлагаю не тратить время на разбор этого примера, а использовать, например, timerfd, коль уж у нас тут Linux.
0
|
13 / 13 / 1
Регистрация: 19.10.2019
Сообщений: 607
|
||||||
31.12.2019, 15:19 [ТС] | 6 | |||||
Все пишут что он не перегружаемый ? Т.е. его нельзя сбросить в ноль, вызвав timer_settime с темиже значениями при инициаллизации.
Да именно о них. Но интересно конечно рассмотреть вопрос шире. Если есть перехватчик posix segfault-ов(SIGSEGV) в линуксе или SEH в винде. Сработают ли они ? Это значит что я сталкиваюсь с неправильным поведением при вызове std::getline(cin, str_command) когда включен мой watchdog/ std::cin не дожидаясь окончания ввода завершается, как будто ктото нажал ENTER. Проблему вроде вылечил, но вылкчил, но не уверен что правильно и/или полностью:
0
|
18896 / 9854 / 2410
Регистрация: 30.01.2014
Сообщений: 17,297
|
|
31.12.2019, 15:52 | 7 |
Сработают, однако программа будет в состоянии UB.
Я бы не стал на это закладываться.
0
|
13 / 13 / 1
Регистрация: 19.10.2019
Сообщений: 607
|
|
31.12.2019, 16:16 [ТС] | 8 |
Задача watchdog-а следить чтоб потоки(основной и дополнительный) не тупили и тем более не были в зависшем состоянии, а если уж такое случилось. то надо как можно корректнее завершить программу. Из этого списка применим только abort, но это уж совсем жёстко. Надо по хорошему счёту вызвать какой нибудь pthread_cancel или ещё лучше меод https://en.cppreference.com/w/cpp/memory/unique_ptr/release какого нибудь умного указателя или на худой конец delete.
0
|
18896 / 9854 / 2410
Регистрация: 30.01.2014
Сообщений: 17,297
|
|
31.12.2019, 16:18 | 9 |
squareroot, timerfd позволит организовать обработку внутри штатного контекста выполнения, без всех этих ограничений.
0
|
13 / 13 / 1
Регистрация: 19.10.2019
Сообщений: 607
|
|
31.12.2019, 16:25 [ТС] | 10 |
Я щас как вы могли заметить пишу сервер на основе boost::asio и его достоинство перед нативными сокетами это кроссплатформенность.
Если я запихну не кроссплатформенный watchdog то получиться каламбур, хотя подозреваю использование POSIX под виндой это большая боль.
0
|
18896 / 9854 / 2410
Регистрация: 30.01.2014
Сообщений: 17,297
|
|
31.12.2019, 16:29 | 11 |
squareroot, он у вас и так некросплатформенный.
Да и в asio есть свои таймеры.
0
|
13 / 13 / 1
Регистрация: 19.10.2019
Сообщений: 607
|
|
31.12.2019, 16:33 [ТС] | 12 |
Почему не кроссплатформенный ?
А таймеры в asio для меня кот в мешке. Годяться ли они для целей watchdog-а большой вопрос. С сигналами всё както понятно. Их посылает система и он сработает если не железно то более гарантированно при подвисших потоках.
0
|
18896 / 9854 / 2410
Регистрация: 30.01.2014
Сообщений: 17,297
|
|
31.12.2019, 16:42 | 13 |
Потому что POSIX нет под виндой. Потому что реализации POSIX различаются в Linux и других юникс-подобных ОС, в небольших, но иногда существенных деталях.
Надо разбираться, значит. Очень маленький это вопрос. Asio использует те же системные механизмы внутри. Если у вас не получается использовать asio, то вы просто что-то не так делаете.
0
|
13 / 13 / 1
Регистрация: 19.10.2019
Сообщений: 607
|
|
31.12.2019, 16:51 [ТС] | 14 |
Наверно надо будет переделать часть кода, применяя std::signal. Плюсы зато под виндой есть А вот с POSIX таймерами надо поколдовать или заглянуть под капот boost::asio. С наступающем Вас!
0
|
18896 / 9854 / 2410
Регистрация: 30.01.2014
Сообщений: 17,297
|
|
31.12.2019, 16:56 | 15 |
https://www.boost.org/doc/libs... boost_1_43
Я бы отказался от этой затеи. Вы либо сделаете все очень сложно и правильно, либо просто, но неправильно. Мне кажется оба варианта так себе. Добавлено через 42 секунды И вас
0
|
13 / 13 / 1
Регистрация: 19.10.2019
Сообщений: 607
|
|
31.12.2019, 19:17 [ТС] | 16 |
DrOffset, А вот если сделать так: Пристрелить вторичные потоки в обработчике watchdog-a, а основной поток не трогать, но выставить флажок глобальной атомарной переменной. Ничего ведь страшного не случиться от того что немного расширим список http://man7.org/linux/man-page... ety.7.html атомарными переменными ?
Добавлено через 11 минут Для винды надо будет запилить свой таймер, но там свои погремушки в части что надёжно/ненадёжно. Добавлено через 2 минуты Просто подозрительны мне таймеры, которые вызываются в контексте, который позволяет делать всё что хочешь, но делать полноценное нагрузочное тестирование я щас не готов. И тратить несколько недель(или месяцев ?) на изучение системного программирования по Linux и Windows я тоже не готов, так сильно отклоняться от первоначальной цели.
0
|
18896 / 9854 / 2410
Регистрация: 30.01.2014
Сообщений: 17,297
|
|
31.12.2019, 20:36 | 17 |
squareroot, проще всего вам использовать таймер asio. Это по всем параметрам выгоднее.
Добавлено через 45 секунд https://ru.cppreference.com/w/... g_atomic_t
0
|
13 / 13 / 1
Регистрация: 19.10.2019
Сообщений: 607
|
|
31.12.2019, 20:55 [ТС] | 18 |
timer asio как говядину второй свежести можно оставить для винды :-)
#ifdef __GNUC__ бла бла бла В линуксе всё очень сурово и у меня иногда тормозит курсор мыши, а винде я такого не припомню.
0
|
18896 / 9854 / 2410
Регистрация: 30.01.2014
Сообщений: 17,297
|
|
31.12.2019, 21:00 | 19 |
Я тоже самое могу сказать про винду, и что, кому теперь верить?
Добавлено через 16 секунд Зачем, если внутри ASIO уже это сделано?
0
|
13 / 13 / 1
Регистрация: 19.10.2019
Сообщений: 607
|
|
31.12.2019, 21:12 [ТС] | 20 |
Затем что для линуксовой версии я бы использовал таймер POSIX потому как я понимаю, скорей всего он посылает сигнал в режиме ядра и в потоке ядра, а малохольный ваш таймер может тупо не сработать из-за какого нибудь гадкого потока при подвисании системы когда его обработчик надо будет вызвать в контексте пользовательского потока . Вот такой мой нубский взгляд на ситуацию.
Добавлено через 6 минут Те ограничение о которых вы говорили, http://man7.org/linux/man-page... ety.7.html они не от балды взялись всётаки.
0
|
31.12.2019, 21:12 | |
31.12.2019, 21:12 | |
Помогаю со студенческими работами здесь
20
Внешний WAtchdog AvrSudio и watchdog Analog Watchdog (AWD) Cortex m0 и watchdog таймер Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |