2023/12/6

linux watchdog

linux kernel 定義了標準的 watchdog interface。
寫在 Documentation/watchdog
其中 watchdog-api.rst 有說明一些基本的操作。

#include <iostream>
#include <fcntl.h>
#include <unistd.h>
#include <sys/ioctl.h>
#include <linux/watchdog.h>

class Watchdog {
private:
	int watchdog_fd;

public:
	Watchdog(const char* device_path = "/dev/watchdog") {
		watchdog_fd = open(device_path,O_RDWR);
		if (watchdog_fd == -1) {
			std::cerr << "Error opening watchdog device" << std::endl;
		}else {
			std::cout << "watchdog open OK" << std::endl;
		}
	}

	~Watchdog() {
		if (watchdog_fd != -1) {
			int options = WDIOS_DISABLECARD;
			ioctl(watchdog_fd,WDIOC_SETOPTIONS,&options);
			close(watchdog_fd);
		}
		std::cout << "watchdog closed OK" << std::endl;
	}

	bool kick() {
		int dummy = 0;
		std::cout << "kick" << std::endl;
		return ioctl(watchdog_fd, WDIOC_KEEPALIVE, &dummy) != -1;
	}
};

int main() {
	Watchdog wd;

	for(int i=0;i<10;i++) {
		wd.kick();
		sleep(10);
	}
		
	return 0;
}
用 raspberry pi測試 (因為 NB 沒有 /dev/watchdog):
$sudo ./watchdog
watchdog open OK
kick
kick
kick
..
kick
watchdog close OK
系統不會 reboot

但是在中途用 Ctrl-C 中斷。會出現
watchdog: watchdog0: watchdog did not stop!
然後 10 sec 後系統 reboot


另外,用 shell command 也可以。
document 說,寫入 'V' 之後close 可以停止 watchdog.
echo 'V' > /dev/watchdog
另外,雖然driver load,但是 watchdog timrer 是沒有啟動的。
一旦有人 open dev node,timer 就開始啟動。
在timeout 之前,寫除了'V' 之外的東西,都可以 reset timer 或是用IOCTL)。

沒有留言:

張貼留言