栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

Android WatchDog

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Android WatchDog

一. Native C++ watchdog:

代码:

        frameworks/av/media/libwatchdog/include/watchdog/Watchdog.h
        frameworks/av/media/libwatchdog/Watchdog.cpp

 Watchdog.h:


#ifndef ANDROID_WATCHDOG_H
#define ANDROID_WATCHDOG_H

#include 
#include 

namespace android {


class Watchdog final {
public:
    Watchdog(std::chrono::steady_clock::duration timeout);
    ~Watchdog();

private:
    timer_t mTimerId;
};

}  // namespace android

#endif  // ANDROID_WATCHDOG_H

 Watchdog.cpp:


#define LOG_TAG "Watchdog"

#include 

#include 
#include 
#include 
#include 
#include 
#include 

namespace android {

Watchdog::Watchdog(::std::chrono::steady_clock::duration timeout) {
    // Create the timer.
    struct sigevent sev;
    sev.sigev_notify = SIGEV_THREAD_ID;
    sev.sigev_notify_thread_id = base::GetThreadId();
    sev.sigev_signo = SIGABRT;
    sev.sigev_value.sival_ptr = &mTimerId;
    int err = timer_create(CLOCK_MONOTONIC, &sev, &mTimerId);
    if (err != 0) {
        PLOG(FATAL) << "Failed to create timer";
    }

    // Start the timer.
    struct itimerspec spec;
    memset(&spec, 0, sizeof(spec));
    auto ns = std::chrono::duration_cast(timeout);
    LOG_ALWAYS_FATAL_IF(timeout.count() <= 0, "Duration must be positive");
    spec.it_value.tv_sec = ns.count() / 1000000000;
    spec.it_value.tv_nsec = ns.count() % 1000000000;
    err = timer_settime(mTimerId, 0, &spec, nullptr);
    if (err != 0) {
        PLOG(FATAL) << "Failed to start timer";
    }
}

Watchdog::~Watchdog() {
    // Delete the timer.
    int err = timer_delete(mTimerId);
    if (err != 0) {
        PLOG(FATAL) << "Failed to delete timer";
    }
}

}  // namespace android

 使用:发送的signal可以根据自己的需要来修改

#include 
#include "Watchdog.h"


int main(int argc, char** argv)
{
    // Watchdog在下面的代码块有效,
    // 如果在5s内,没有出代码块,就会狗叫,定时器就会给自己发送SIGABRT信号。
    // 如果在5s内出下面的代码块,就会调用Watchdog析构函数,timer_delete删除定时器。
    // 要旨:主要针对代码块,出代码块会析构
    {
        android::Watchdog watchdog(std::chrono::seconds(5));
        // 具体工作XXX
        sleep(6);
    }
    return 0;
}

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/664182.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号