gpt4 book ai didi

c - 锁定 Linux 串口

转载 作者:IT王子 更新时间:2023-10-29 00:52:48 26 4
gpt4 key购买 nike

我有一个关于 Linux 串行端口的问题要解决。我可以很好地打开、读取和关闭端口。但是,我想确保在任何给定时间我都是唯一从端口读取/写入的人。

在调用 open() 函数后,我认为这已经为我完成了。但是,我可以在程序的同一个端口上多次调用 open()。我也可以有两个同时从同一个端口读取的线程。

我尝试用 flock() 解决这个问题,但我仍然遇到同样的问题。是不是因为两个系统调用都来自同一个 pid,即使每组打开和读取涉及不同的文件描述符?郑重声明,两次 open() 调用都会返回一个有效的文件描述符。

因此,我想知道是否有任何方法可以针对问题进行补救。从我的程序的角度来看,如果对 open() 的两次调用在同一个端口上成功,这没什么大不了的,因为程序员应该意识到它们所引起的欢闹。但是,我只是想确保当我打开一个端口时,我是唯一可以访问它的进程。

感谢您的帮助。

最佳答案

在 Linux 中,您可以使用 TIOCEXCL TTY ioctl 来阻止设备的其他 open() 成功(它们将返回 -1errno==EBUSY,设备或资源繁忙)。这仅适用于终端和串行设备,但不依赖于建议锁定。

例如:

#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/ioctl.h>
#include <termios.h>
#include <fcntl.h>
#include <errno.h>

int open_device(const char *const device)
{
int descriptor, result;

if (!device || !*device) {
errno = EINVAL;
return -1;
}

do {
descriptor = open(device, O_RDWR | O_NOCTTY);
} while (descriptor == -1 && errno == EINTR);
if (descriptor == -1)
return -1;

if (ioctl(descriptor, TIOCEXCL)) {
const int saved_errno = errno;
do {
result = close(descriptor);
} while (result == -1 && errno == EINTR);
errno = saved_errno;
return -1;
}

return descriptor;
}

希望这对您有所帮助。

关于c - 锁定 Linux 串口,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17980725/

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