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

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

29.12.2019, 22:41. Показов 9087. Ответов 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
Ответ Создать тему
Новые блоги и статьи
1С: Контроль уникальности заводского номера
Maks 23.03.2026
Алгоритм контроля уникальности заводского (или серийного) номера на примере документа выдачи шин для спецтехники с табличной частью. Данные берутся из регистра сведений, по которому настроено. . .
Хочу заставить корпорации вкладываться в здоровье сотрудников: делаю мат модель здравосохранения
anaschu 22.03.2026
e7EYtONaj8Y Z4Tv2zpXVVo https:/ / github. com/ shumilovas/ med2. git
1С: Программный отбор элементов справочника по группе
Maks 22.03.2026
Установка программного отбора элементов справочника "Номенклатура" из модуля формы документа. В качестве фильтра для отбора справочника служит группа номенклатуры. Отбор по наименованию группы. . .
Как я обхитрил таблицу Word
Alexander-7 21.03.2026
Когда мигает курсор у внешнего края таблицы, и нам надо перейти на новую строку, а при нажатии Enter создается новый ряд таблицы с ячейками, то мы вместо нервных нажатий Энтеров мы пишем любые буквы. . .
Krabik - рыболовный бот для WoW 3.3.5a
AmbA 21.03.2026
без регистрации и смс. Это не торговля, приложение не содержит рекламы. Выполняет свою непосредственную задачу - автоматизацию рыбалки в WoW - и ничего более. Однако если админы будут против -. . .
1С: Программный отбор элементов справочника по значению перечисления
Maks 21.03.2026
Установка программного отбора элементов справочника "Сотрудники" из модуля формы документа. В качестве фильтра для отбора служит значение перечислений. / / Событие "НачалоВыбора" реквизита на форме. . .
Переходник USB-CAN-GPIO
Eddy_Em 20.03.2026
Достаточно давно на работе возникла необходимость в переходнике CAN-USB с гальваноразвязкой, оный и был разработан. Однако, все меня терзала совесть, что аж 48-ногий МК используется так тупо: просто. . .
Оттенки серого
Argus19 18.03.2026
Оттенки серого Нашёл в интернете 3 прекрасных модуля: Модуль класса открытия диалога открытия/ сохранения файла на Win32 API; Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru