gpt4 book ai didi

c - 如何从 2 个进程 ping/dev/watchdog?

转载 作者:行者123 更新时间:2023-12-01 16:08:45 24 4
gpt4 key购买 nike

在 Linux(在 ARM 上运行)中,有一个进程有一个到 /dev/watchdog/ 的开放 fd,并且每隔几秒发送一个 ioctl() ,如下所示保持存活:

while (1) { 
ioctl(fd, WDIOC_KEEPALIVE, 0);
sleep(10);
}

我也想从另一个进程发送保持事件状态,但我无法打开另一个 fd 到 /dev/watchdog/:当我尝试回显到 /dev/watchdog 时/ 我收到错误“设备或资源繁忙”。

  1. 我在哪里可以看到看门狗被定义为一次仅适用于 1 个进程? (我在另一个 Linux 中看到某些进程可以打开 fd 到 /dev/watchdog/)。

  2. 我该怎么做才能从 2 个进程喂养看门狗?

最佳答案

由于/dev/watchdog在内核中的实现,只有一个进程可以同时使用它,所以从两个不同的进程打开/dev/watchdog进程是不可能的。

您可以在 Linux 内核的源代码中看到这一点,特别是在 drivers/watchdog/watchdog_dev.c 中。 。这是相关的代码片段:

/*
* watchdog_open: open the /dev/watchdog* devices.
* @inode: inode of device
* @file: file handle to device
*
* When the /dev/watchdog* device gets opened, we start the watchdog.
* Watch out: the /dev/watchdog device is single open, so we make sure
* it can only be opened once.
*/

static int watchdog_open(struct inode *inode, struct file *file)
{
/* ... */

/* the watchdog is single open! */
if (test_and_set_bit(_WDOG_DEV_OPEN, &wd_data->status))
return -EBUSY;

/* ... */

如果您想从两个不同的进程向看门狗提供数据,您可以通过创建一个简单的“主”程序来解决此问题,该程序与看门狗对话,同时根据需要编排两个子进程。这可以通过不同的方式来完成(管道、套接字、线程等)。单popen()每个子进程似乎是一个简单的解决方案。

这是一个工作示例,master.c:

#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/ioctl.h>
#include <linux/watchdog.h>

int main(int argc, char **argv) {
int watchdog_fd;
FILE *child1_fp, *child2_fp;

if (argc != 3 || !argv[1] || !*argv[1] || !argv[2] || !*argv[2]) {
fprintf(stderr, "Usage: %s 'CHILD_1_COMMAND' 'CHILD_2_COMMAND'\n", argv[0]);
return 1;
}

// Open a fd to talk to the watchdog.
watchdog_fd = open("/dev/watchdog", O_RDWR);
if (watchdog_fd == -1) {
perror("open failed");
return 1;
}

// Start the first process.
child1_fp = popen(argv[1], "r");
if (child1_fp == NULL) {
perror("popen (1) failed");
return 1;
}

// Start the second process.
child2_fp = popen(argv[2], "r");
if (child2_fp == NULL) {
perror("popen (2) failed");
return 1;
}

while (1) {
char tmp;
size_t count;

// Get one byte of data from each of the two processes.
count = fread(&tmp, 1, 1, child1_fp);
count += fread(&tmp, 1, 1, child2_fp);

// If both processes provided the data, ping the watchdog.
if (count == 2) {
if (ioctl(watchdog_fd, WDIOC_KEEPALIVE, 0) < 0)
perror("ioctl failed");
}
}

return 0;
}

两个相同的程序a.cb.c仅用于测试目的:

#include <stdio.h>
#include <unistd.h>

int main(void) {
setvbuf(stdout, NULL, _IONBF, 0);

while (1) {
putchar('x');
sleep(10);
}
}

编译并运行:

$ gcc -o master master.c
$ gcc -o a a.c
$ gcc -o b b.c

$ ./master ./a ./b

在上面的示例代码中,master 当且仅当两个子进程都活着并且正在运行时才对看门狗执行 ping 操作:如果两个子进程之一挂起或死亡,则主进程将停止 ping 看门狗。但是,重新设计逻辑以使其工作方式不同很简单,并且使其适用于两个以上的子进程也很简单。

关于c - 如何从 2 个进程 ping/dev/watchdog?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59547136/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com