AHA! Покопавшись в ядре linux/watchdog.h
и drivers/watchdog/softdog.c
, я смог определить возможности интерфейса softdog ioctl()
. Глядя на возможности, которые он объявляет в struct watchdog_info
:
static struct watchdog_info ident = {
.options = WDIOF_SETTIMEOUT |
WDIOF_KEEPALIVEPING |
WDIOF_MAGICCLOSE,
.firmware_version = 0,
.identity = "Software Watchdog",
};
Это поддерживает магическое закрытие, которое (кажется) отменяет CONFIG_WATCHDOG_NOWAYOUT
. Поэтому при нормальном завершении я должен записать один символ 'V' в /dev/watchdog
, затем закрыть его, и таймер перестанет считать.
Простой ioctl()
в дескрипторе файла для /dev/watchdog
, запрашивающий WDIOC_GETSUPPORT
, позволяет определить, установлен ли этот флаг. Псевдокод:
int fd;
struct watchdog_info info;
fd = open("/dev/watchdog", O_WRONLY);
if (fd == -1) {
perror("open");
// abort, timer did not start - no additional concerns
}
if (ioctl(fd, WDIOC_GETSUPPORT, &info)) {
perror("ioctl");
// abort, but you probably started the timer! See below.
}
if (WDIOF_MAGICCLOSE & info.options) {
printf("Watchdog supports magic close char\n");
// You have started the timer here! Handle that appropriately.
}
При работе с аппаратными сторожевыми системами вам может потребоваться открыть с O_NONBLOCK
, чтобы ioctl()
, а не open()
блоков (следовательно, обнаружение занятой карты).
Если WDIOF_MAGICCLOSE
не поддерживается, следует просто предположить, что программный сторожевой таймер настроен на NOWAYOUT. Помните, что просто , открыв , устройство успешно начнет обратный отсчет. Если все, что вы делаете, это проверяет, поддерживает ли оно магическое закрытие, и оно делает, тогда магическое закрытие В противном случае, убедитесь, что у вас есть работающий сторожевой таймер.
К сожалению, нет реального способа узнать наверняка, не запустив его, по крайней мере, я не смог найти.