Форум программистов, компьютерный форум, киберфорум
C/С++ под Linux
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.93/41: Рейтинг темы: голосов - 41, средняя оценка - 4.93
13 / 13 / 1
Регистрация: 19.10.2019
Сообщений: 607

Watchdog на основе таймеров POSIX

29.12.2019, 22:41. Показов 9234. Ответов 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
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
#include "../include/error.h"
#include "../include/watchdog.h"
 
// (с) http://man7.org/linux/man-pages/man2/timer_create.2.html
#define CLOCKID CLOCK_REALTIME
#define SIG SIGRTMIN + 10
 
IWatcher* callback = nullptr;
 
typedef void (*TSigFunc1)(int, siginfo_t *, void *);
typedef void (*TSigFunc2)(int);
TSigFunc1 prev_handler1 = nullptr;
TSigFunc2 prev_handler2 = nullptr;
pid_t current_pid = getpid();
 
void IWatcher::reset()
{
    //
}
 
static void signal_handler(int _sig, siginfo_t * _si, void * _uc)
{
    bool result = false;
    if ((_sig == SIG) && (_si))
    {
        if ((callback) && (_si->si_pid == current_pid))
        {
            //errspace::show_errmsg("caught valid signal");
            //(*callback)(_si);
            result = true;
        }
    }
    if (!result)
    {
        //errspace::show_errmsg("caught invalid signal");
    }
    //if (prev_handler1) prev_handler1(_sig, _si, _uc);
    //if (prev_handler2) prev_handler2(_sig);
    //signal(_sig, SIG_IGN);
}
 
timer_t timerid;
 
bool start_wd(std::size_t _msecs, IWatcher* _cback)
{
   static constexpr auto billion = 1'000'000'000;
   static constexpr auto million = 1'000'000;
   callback = _cback;
   bool result = false;
   struct sigevent sev;
   struct itimerspec its;
   long long freq_nanosecs;
   sigset_t mask;
   struct sigaction sa;
   struct sigaction old_sa;
   // Establish handler for timer signal
   sa.sa_flags = SA_SIGINFO;
   sa.sa_sigaction = signal_handler;
   sigemptyset(&sa.sa_mask);
   if (sigaction(SIG, &sa, &old_sa) == -1)
   {
       errspace::show_errmsg("Failed to setup watchdog: Establish handler");
       return result;
   }
   prev_handler1 =  old_sa.sa_sigaction;
   prev_handler2 =  old_sa.sa_handler;
   // Block timer signal temporarily
   sigemptyset(&mask);
   sigaddset(&mask, SIG);
   if (sigprocmask(SIG_SETMASK, &mask, NULL) == -1)
   {
       errspace::show_errmsg("Failed to setup watchdog: Blocking signal");
       return result;
   }
 
   // Create the timer
   sev.sigev_notify = SIGEV_SIGNAL;
   sev.sigev_signo = SIG;
   sev.sigev_value.sival_ptr = &timerid;
   if (timer_create(CLOCKID, &sev, &timerid) == -1)
   {
       errspace::show_errmsg("Failed to setup watchdog: create timer");
       return result;
   }
 
   // Start the timer
   freq_nanosecs = million*_msecs;
   its.it_value.tv_sec = freq_nanosecs / billion;
   its.it_value.tv_nsec = freq_nanosecs % billion;
   its.it_interval.tv_sec = its.it_value.tv_sec;
   its.it_interval.tv_nsec = its.it_value.tv_nsec;
 
   if (timer_settime(timerid, 0, &its, NULL) == -1)
   {
       errspace::show_errmsg("Failed to setup watchdog: set time");
       return result;
   }
   // ????
   // std::this_thread::sleep_for(std::chrono::milliseconds(_msecs*2));
   /* Sleep for a while; meanwhile, the timer may expire
      multiple times */
 
   //printf("Sleeping for %d seconds\n", atoi(argv[1]));
   //sleep(atoi(argv[1]));
 
   // Unlock the timer signal, so that timer notification can be delivered
   if (sigprocmask(SIG_UNBLOCK, &mask, NULL) == -1)
   {
       errspace::show_errmsg("Failed to setup watchdog: Unblocking signal");
       return result;
   }
    result = true;
    return result;
}
 
void stop_wd()
{
    sigset_t mask;
    struct sigaction action;
 
    // Block timer signal temporarily
    sigemptyset(&mask);
    sigaddset(&mask, SIG);
    if (sigprocmask(SIG_SETMASK, &mask, NULL) == -1)
    {
        errspace::show_errmsg("Failed to reset watchdog: Blocking signal");
        return;
    }
    timer_delete(timerid);
    action.sa_handler = SIG_DFL;
    action.sa_flags   = SA_RESETHAND;
 
    if (sigaction(SIGINT, &action, NULL) == -1)
    {
        errspace::show_errmsg("Failed to reset watchdog: reset handler");
        return;
    }
 
    // Unlock the timer signal, so that timer notification
    //   can be delivered
    if (sigprocmask(SIG_UNBLOCK, &mask, NULL) == -1)
    {
        errspace::show_errmsg("Failed to reset watchdog: Unblocking signal");
        return;
    }
}
main.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
#include <iostream>
#include "../include/common.h"
#include "../include/error.h"
#include "../include/watchdog.h"
#include "../include/mng_thread.h"
 
class Watcher : public IWatcher
{
public:
    template<typename ...Args>
    Watcher(Args... _args)
    {
        auto tpack = std::make_tuple(_args...);
    }
protected:
    virtual void operator ()(siginfo_t *si)
    {
        //printf("Caught signal %d\n", sig);
        //print_siginfo(si);
        //#define errExit(msg)    do { perror(msg); exit(EXIT_FAILURE); \
        //                           } while (0)
        errspace::show_errmsg("watchdog timeout");
        timer_t tidp;
        int _or;
 
        tidp = si->si_value.sival_ptr;
 
        //printf("    sival_ptr = %p; ", si->si_value.sival_ptr);
        //printf("    *sival_ptr = 0x%lx\n", (long) tidp);
 
        _or = timer_getoverrun(tidp);
        //if (_or == -1)
        //    errExit("timer_getoverrun");
        //else
         //   printf("    overrun count = %d\n", _or);
    }
};
 
int main(int argc, char *argv[])
{
    static Watcher w{};
    IWatcher* iw = &w;
 
    const char * FUNCTION = __FUNCTION__;
    try
    {
        using std::cout;
        using std::cin;
        using std::endl;
        cout << "Server is started" << endl;
        std::string str_command;
        while(1)
        {
            LOG << "enter command:";
            if (std::getline(cin, str_command))
            {
                LOG << "command:" << str_command << " was got";
                if (str_command == "q") break;
                if (str_command == "e") throw 0;
                if (str_command == "s")
                {
                    start_wd(1000, iw );
                }
                if (str_command == "p") stop_wd();
            }
            str_command = "";
        }
    }
    catch (...)
    {
        errspace::show_errmsg(FUNCTION);
    }
    return EXIT_SUCCESS;
}
#endif
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
29.12.2019, 22:41
Ответы с готовыми решениями:

WatchDog
Есть устройство на меге16 (пока на ней) которое тупо запоминает в EEPROM во сколько на одном из пинов порта появилась единица. Не не знаю...

Пробуждение по watchdog
Доброго времени суток. На старом АТ90S нужно уйти в сон, проснуться по watchdog, убедиться что событие не произошло, и опять уйти в сон. ...

WatchDog в Python
Добрый день! Интересует возможность использования watchdoga в Python. Есть ли реализация или модуль в Python, похожий на сторожевой...

65
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,818
08.01.2020, 12:24
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от squareroot Посмотреть сообщение
кроссплатформенный таймер без дополнительных потоков
Такого не бывает. Все решения, работающие в основном потоке используют polling (в том или ином виде), если вам оно не подходит, то и решения нет.
Поэтому:
Если ваши действия вписываются в список разрешенных действий из обработчика сигнала - используйте таймер на сигналах.
В windows придется делать что-то другое.

Добавлено через 6 минут
_______________
Я бы сделал процесс, с polling`ом timeprfd и pipe.
Через pipe оповещаем watchdog о необходимости сброса таймера из обычного контекста выполнения.
Для перехвата критических ошибок делаем обработку сигналов, в которой через тот же pipe (запись в pipe из обработчика разрешена) оповещаем watchdog-процесс о необходимости сброса.
0
13 / 13 / 1
Регистрация: 19.10.2019
Сообщений: 607
08.01.2020, 13:29  [ТС]
Цитата Сообщение от DrOffset Посмотреть сообщение
Такого не бывает. Все решения, работающие в основном потоке используют polling (в том или ином виде), если вам оно не подходит, то и решения нет.
Кажется пришла моя очередь учить Вас.
Давайте для начала заглянем сюда: /proc/interrupts с помощью cat /proc/interrupts
Лично у меня на нулевом прерывании, не поверите, но такая штука как таймер.
Далее, как вы сами согласились ранее таймер это объект ядра. Не счётчик, а именно таймер. Причём объект ядра он и в винде и в линуксе и более того обе оси предоставляют необходимый сервис для того чтобы поюзать этот самый таймер,
а значит нет смысла пытаться сделать свой сурогат на отдельном потоке.
0
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,818
08.01.2020, 13:40
Цитата Сообщение от squareroot Посмотреть сообщение
Кажется пришла моя очередь учить Вас.
Ваша самоуверенность вас погубит.

Вы писали про "кроссплатформенный" таймер. Я вам ответил про кроссплатформенный таймер. Как раз именно потому, что он объект ядра - решение без "суррогатов в отдельном потоке" не будет кроссплатформенным.
0
13 / 13 / 1
Регистрация: 19.10.2019
Сообщений: 607
08.01.2020, 13:44  [ТС]
Цитата Сообщение от DrOffset Посмотреть сообщение
Ваша самоуверенность вас погубит.

Вы писали про "кроссплатформенный" таймер. Я вам ответил про кроссплатформенный таймер. Как раз именно потому, что он объект ядра - решение без "суррогатов в отдельном потоке" не будет кроссплатформенным.
Оно будет кроссплатформенным, когда будет использоваться кроссплатформенная либа, где уже сделана обёртка над платформа-зависмыми сервисами.
В Qt взяли и сделали таймер. Он вполне себе кроссплатформенный, но Qt шибко толстый, поэтому мой взор обратили на себя posix либы.
0
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,818
08.01.2020, 13:55
Цитата Сообщение от squareroot Посмотреть сообщение
В Qt взяли и сделали таймер. Он вполне себе кроссплатформенный, но Qt шибко толстый,
А вы знаете как организован таймер в Qt?
Там тот же самый polling если что, да только не для объекта ядра таймера, а прямо в userspace, на основе таймаута самой функции poll\select.

Добавлено через 6 минут
Цитата Сообщение от squareroot Посмотреть сообщение
Оно будет кроссплатформенным, когда будет использоваться кроссплатформенная либа, где уже сделана обёртка над платформа-зависмыми сервисами.
Может пора определиться?

Еще раз: решения, эксплуатирующие только один поток могут быть:
1) на основе polling`а (poll\select\epoll, WaitForSingleObject из WinAPI)
2) на основе сигналов.

Кроссплатформенные решения с polling`ом есть - asio, Qt. Вы сказали, что поллинг не подходит (почему не подходит - не совсем ясно - есть подозрение, что вы просто не разобрались как их готовить).
Дальше я на основе вашего ответа говорю, что тогда для вас остались только сигналы (если не делать второй поток - явно или неявно), для них кроссплатформенного решения - нет.
Вопросы?
0
13 / 13 / 1
Регистрация: 19.10.2019
Сообщений: 607
08.01.2020, 14:12  [ТС]
Цитата Сообщение от DrOffset Посмотреть сообщение
А вы знаете как организован таймер в Qt?
Там тот же самый polling если что, да только не для объекта ядра таймера, а прямо в userspace, на основе таймаута самой функции poll\select.

Добавлено через 6 минут

Может пора определиться?

Еще раз: решения, эксплуатирующие только один поток могут быть:
1) на основе polling`а (poll\select\epoll, WaitForSingleObject из WinAPI)
2) на основе сигналов.

Кроссплатформенные решения с polling`ом есть - asio, Qt. Вы сказали, что поллинг не подходит (почему не подходит - не совсем ясно - есть подозрение, что вы просто не разобрались как их готовить).
Дальше я на основе вашего ответа говорю, что тогда для вас остались только сигналы (если не делать второй поток - явно или неявно), для них кроссплатформенного решения - нет.
Вопросы?
Вы правильно меня поправили с Qt. В Qt я долго пытался давно давно найти как сделать ввод с клавиатуры в консольном режиме и обламался.
Пришлось писать системные обработчики перехвата клавишь с клавиатуры.
Вот у меня щас в основном потоке пользовательский ввод есть через std::cin и никакой поллинг поэтому там невозможен.
У меня щас нет винды под рукой чтоб тестировать вариант для винды. да и самм сервисы могут эволюционировать поэтому лучше когда это ответсвенность либы, а не моя. С сигналами в винде непонятно как обстоят дела. Вроде как они должны быть раз уж ввели std::signal, но тайиера там с сигналами не дружат.
0
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,818
08.01.2020, 14:16
Цитата Сообщение от squareroot Посмотреть сообщение
В Qt я долго пытался давно давно найти как сделать ввод с клавиатуры в консольном режиме и обламался.
В Unix можно на QSocketNotifier повесить дескриптор консоли. Тогда поллинг будет возможен для консоли.

У меня есть небольшой пример (не для Qt) ка ктакое организуется в принципе. Могу показать, если нужно.
0
13 / 13 / 1
Регистрация: 19.10.2019
Сообщений: 607
08.01.2020, 14:20  [ТС]
Цитата Сообщение от DrOffset Посмотреть сообщение
В Unix можно на QSocketNotifier повесить дескриптор консоли. Тогда поллинг будет возможен для консоли.

У меня есть небольшой пример (не для Qt) ка ктакое организуется в принципе. Могу показать, если нужно.
Взглнуть любопытно, но пока нет желания юзать Qt если честно. Но посмотреть любопытно.
0
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,818
08.01.2020, 15:06
Цитата Сообщение от squareroot Посмотреть сообщение
Вроде как они должны быть раз уж ввели std::signal, но тайиера там с сигналами не дружат.
Ну поэтому я вам и пишу, что сигналы - это априори некроссплатформенно (кажется на первой странице еще говорил).
SEH - может заменить сигналы в вин, но только для критических ошибок.
А в UNIX сигналы это нечто большее, чем обработка ошибок.
Для сигналов в Win отдельное API, которое опять же завязано на polling.
Примеры:
https://docs.microsoft.com/ru-... er-objects (поллинг через WaitForSingleObject)
https://docs.microsoft.com/ru-... ing-timers (поллинг через очередь событий)
Есть еще:
https://docs.microsoft.com/en-... (v%3Dvs.85) (в отдельном потоке)

Добавлено через 1 минуту
Цитата Сообщение от squareroot Посмотреть сообщение
пока нет желания юзать Qt если честно.
Там нет Qt, я же сказал (но принцип подойдет и для Qt).
0
13 / 13 / 1
Регистрация: 19.10.2019
Сообщений: 607
08.01.2020, 15:30  [ТС]
Цитата Сообщение от DrOffset Посмотреть сообщение
https://docs.microsoft.com/ru-... ing-timers (поллинг через очередь событий)
Давно я не имел дело с виндовыми замарочками, но вроде ничего не забыл. Не очень понимаю причём тут поллинг. События приходят в процедуру окна, которая не мешает работе основного потока. На уровне приложения поллинг не требуется.

Цитата Сообщение от DrOffset Посмотреть сообщение
Там нет Qt, я же сказал (но принцип подойдет и для Qt).
Да, конечно. Выкладывайте. Будет интересно взглянуть.
0
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,818
08.01.2020, 15:57
Цитата Сообщение от squareroot Посмотреть сообщение
События приходят в процедуру окна, которая не мешает работе основного потока.
События проходят через такой цикл.
C++
1
2
3
4
5
6
MSG msg = { };
while (GetMessage(&msg, NULL, 0, 0))
{
    TranslateMessage(&msg);
    DispatchMessage(&msg);
}
Функция GetMessage блокирует поток, пока не придет событие.
0
13 / 13 / 1
Регистрация: 19.10.2019
Сообщений: 607
08.01.2020, 17:26  [ТС]
Цитата Сообщение от DrOffset Посмотреть сообщение
События проходят через такой цикл.
C++
1
2
3
4
5
6
MSG msg = { };
while (GetMessage(&msg, NULL, 0, 0))
{
    TranslateMessage(&msg);
    DispatchMessage(&msg);
}
Функция GetMessage блокирует поток, пока не придет событие.
Не ну так наверно можно, и полезно для какихто случаев. Но изначально всё приходит в процедуру окна, которая вызывается асинхронно работе основного потока.
https://docs.microsoft.com/en-... procedures
https://docs.microsoft.com/en-... dfrom=MSDN

Добавлено через 9 минут
Хотя нет, вспомнил. Процедуру главного окна надо зарегистрировать прежде она будет вызываться. Так что ваш вариант более изначальный.

Добавлено через 1 час 6 минут
Но процедура главного окна вызывается операционной системой асинхронно работе основного потока. Скорей всего в основном потоке ненадолго приостанавливая его. И это по сути эквивалент обработчика сигналов. Хотя конечно есть существенные отличия между этими механизмами.
0
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,818
08.01.2020, 17:31
Цитата Сообщение от squareroot Посмотреть сообщение
Но процедура главного окна вызывается операционной системой асинхронно работе основного потока. Скорей всего в основном потоке ненадолго приостанавливая его. И это по сути эквивалент обработчика сигналов.
Нет, оно вызывается синхронно. Не только синхронно, но и явно с помощью функции
DispatchMessage: https://docs.microsoft.com/en-... tchmessage в этом же цикле.
Dispatches a message to a window procedure
А вы описали сейчас какую-то эмуляцию синхронного режима через асинхронный. Так не происходит.

Цитата Сообщение от squareroot Посмотреть сообщение
И это по сути эквивалент обработчика сигналов.
Ничего подобного. Учите матчасть.
0
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,818
08.01.2020, 17:33
Цитата Сообщение от squareroot Посмотреть сообщение
Да, конечно. Выкладывайте. Будет интересно взглянуть.
Это демонстрационный проект (с++14). p_events.zip
Никаких претензий по качеству кода, архитектуре, целостности, работоспособности и т.п. по нему не принимаю
0
13 / 13 / 1
Регистрация: 19.10.2019
Сообщений: 607
08.01.2020, 18:29  [ТС]
Цитата Сообщение от DrOffset Посмотреть сообщение
Нет, оно вызывается синхронно. Не только синхронно, но и явно с помощью функции
DispatchMessage: https://docs.microsoft.com/en-... tchmessage в этом же цикле.


А вы описали сейчас какую-то эмуляцию синхронного режима через асинхронный. Так не происходит.


Ничего подобного. Учите матчасть.
Спасибо. Это значит я в своё время я неправильно выучился. Ложное знание хуже незнания Я почемуто был уверен что дело обостоит именно так как я описал. Но я много лет не касался этой темы.

Добавлено через 47 минут
Цитата Сообщение от DrOffset Посмотреть сообщение
Это демонстрационный проект (с++14). Вложение 1102221
Никаких претензий по качеству кода, архитектуре, целостности, работоспособности и т.п. по нему не принимаю
Это для общего развития, только посмотреть.
Но переделывать ничего не буду.
Если в винде все таймеры работают только через опрос (polling), значит для винды вотчдога не будет. Смысла не вижу просто.
0
13 / 13 / 1
Регистрация: 19.10.2019
Сообщений: 607
09.01.2020, 04:00  [ТС]
Может кто нибудь знает почему здесь функция завершается с ошибкой:

C++
1
2
3
4
if (timer_delete(m_timerid) == m_error_code);
{
            errspace::show_errmsg("Failed to reset watchdog: delete timer");
}
Полный код функции остановки вотчдога тут:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
    void stop_wd()
    {
        if (!is_started) return;
    #ifdef MULTITHREAD
        if (!(main_thread_test.get() == std::this_thread::get_id()))
        {
            assert("stop_wd is called not in main thread");
        }
    #endif
        bool result = false;
    #ifdef POSIX_TIMER
        sigset_t mask;
        struct sigaction action;
        struct itimerspec its;
        // Stop the timer
        its.it_value.tv_sec = 0;
        its.it_value.tv_nsec = 0;
        its.it_interval.tv_sec = 0;
        its.it_interval.tv_nsec = 0;
        // error
        if (timer_delete(m_timerid) == m_error_code);
        {
            errspace::show_errmsg("Failed to reset watchdog: delete timer");
        }
        // Block timer signal temporarily
 
        sigemptyset(&mask);
        sigaddset(&mask, SIG);
        if (sigprocmask(SIG_SETMASK, &mask, nullptr) == m_error_code)
        {
            errspace::show_errmsg("Failed to reset watchdog: Blocking signal");
            return;
        }
 
 
        if (timer_settime(m_timerid, 0, &its, nullptr) == m_error_code)
        {
            errspace::show_errmsg("Failed to setup watchdog: set time");
            return;
        }
 
        //if (timer_delete(timerid) == error_code);
        {
            //errspace::show_errmsg("Failed to reset watchdog: delete timer");
            //return;
        }
 
        action.sa_handler = SIG_DFL;
        action.sa_sigaction = nullptr;//SIG_DFL;
        action.sa_flags   = SA_RESETHAND;
 
        if (sigaction(SIG, &action, nullptr) == m_error_code)
        {
            errspace::show_errmsg("Failed to reset watchdog: reset handler");
            return;
        }
 
        // Unlock the timer signal, so that timer notification
        // can be delivered
 
        if (sigprocmask(SIG_UNBLOCK, &mask, nullptr) == m_error_code)
        {
            errspace::show_errmsg("Failed to reset watchdog: Unblocking signal");
            return;
        }
        //raise(SIG);
    #else
 
    #endif
        is_started = false;
    }
0
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,818
09.01.2020, 08:42
squareroot, я бы посмотрел на полный, компилируемый пример, воспроизводящий эту проблему.
0
13 / 13 / 1
Регистрация: 19.10.2019
Сообщений: 607
09.01.2020, 15:46  [ТС]
Цитата Сообщение от DrOffset Посмотреть сообщение
squareroot, я бы посмотрел на полный, компилируемый пример, воспроизводящий эту проблему.
А там надо ещё понять есть ли проблема. Если не использовать эти строчки кода, то всё работает хорошо.

C++
1
2
3
4
        if (timer_delete(m_timerid) == m_error_code);
        {
            errspace::show_errmsg("Failed to reset watchdog: delete timer");
        }
Но зачемто придумали эту функцию. Мне бы самому увидеть рабочий пример её применения.
0
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,818
09.01.2020, 16:29
Цитата Сообщение от squareroot Посмотреть сообщение
Мне бы самому увидеть рабочий пример её применения.
Мне бы для начала ваш, "нерабочий", увидеть, чтобы можно было запустить у себя.
0
13 / 13 / 1
Регистрация: 19.10.2019
Сообщений: 607
09.01.2020, 16:57  [ТС]
Цитата Сообщение от DrOffset Посмотреть сообщение
Мне бы для начала ваш, "нерабочий", увидеть, чтобы можно было запустить у себя.
Мой нерабочий это несколько тысяч строк кода Вы не против если я вернусь к этой теме чуть позже ?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
09.01.2020, 16:57
Помогаю со студенческими работами здесь

Watchdog из Arduino
Есть пк, который может зависнуть, или может зависнуть у него сетевуха. Просьба не пинать в сторону, уже все сто раз было, ищи итп... ...

Внешний WAtchdog
Добрый день! Есть рабочее устройство на AVR! Надо к нему прикрепить внешний watchdog, тоесть устройство будет переодически подтягивать...

AvrSudio и watchdog
Не могу дождаться чтобы аврстудия ушла в ресет или прерывание по вочдогу. В реале сбрасывает, а в студии ну никак.

Analog Watchdog (AWD)
Добрый день. Уже третьи сутки бъюсь с analog watchdog, не хочет зараза, нормально работать. Код ниже. В одиночном преобразовании все...

Cortex m0 и watchdog таймер
Всем доброго времени суток!!! Программирую схему на базе ядра cortex m0. Не могу заставить работать watchdog. Вроде делаю всё правильно: ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
60
Ответ Создать тему
Новые блоги и статьи
Архитектура слоя интернета для сервера-слоя.
Hrethgir 11.04.2026
В продолжение https:/ / www. cyberforum. ru/ blogs/ 223907/ 10860. html Знаешь что я подумал? Раз мы все источники пишем в голове ветки, то ничего не мешает добавить в голову такой источник, который сам. . .
Подстановка значения реквизита справочника в табличную часть документа
Maks 10.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: при выборе сотрудника (справочник Сотрудники) в ТЧ документа. . .
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
модель ЗдравоСохранения 8. Подготовка к разному выполнению заданий
anaschu 08.04.2026
https:/ / github. com/ shumilovas/ med2. git main ветка * содержимое блока дэлэй из старой модели теперь внутри зайца новой модели 8ATzM_2aurI
Блокировка документа от изменений, если он открыт у другого пользователя
Maks 08.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в конфигурации КА2. Задача: запретить редактирование документа, если он открыт у другого пользователя. / / . . .
Система безопасности+живучести для сервера-слоя интернета (сети). Двойная привязка.
Hrethgir 08.04.2026
Далее были размышления о системе безопасности. Сообщения с наклонным текстом - мои. А как нам будет можно проверить, что ссылка наша, а не подделана хулиганами, которая выбросит на другую ветку и. . .
Модель ЗдрввоСохранения 7: больше работников, больше ресурсов.
anaschu 08.04.2026
работников и заданий может быть сколько угодно, но настроено всё так, что используется пока что только 20% kYBz3eJf3jQ
Дальние перспективы сервера - слоя сети с космологическим дизайном интефейса карты и логики.
Hrethgir 07.04.2026
Дальнейшее ближайшее планирование вывело к размышлениям над дальними перспективами. И вот тут может быть даже будут нужны оценки специалистов, так как в дальних перспективах всё может очень сильно. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru