gpt4 book ai didi

linux - 根据设备响应而不是 udev 设备信息使用 udev 创 build 备符号链接(symbolic link)

转载 作者:太空宇宙 更新时间:2023-11-04 09:55:19 25 4
gpt4 key购买 nike

我将三个不同的串行设备连接到三个 USB 串行转换器 (FTDI USB-RS232)。如果我连接它们,我会按预期获得通用设备名称/dev/ttyUSBx。当我尝试编写一些 udev 规则时,udevadm 向我显示了三个设备的相同输出,但某些设备序列号属性除外。

这些序列号在每台设备上都会发生变化,因此如果我使用不同的 USB 串行转换器,我的规则将不再有效。因此,我需要一种方法来与连接到串行转换器的特定设备进行通信,并通过其响应来识别它。

"Writing udev rules" HOWTO , 说明了以下关于使用 PROGRAM 功能调用外部程序来命名设备的内容:

PROGRAM is used for running programs which produce device names (and they shouldn't do anything other than that). When those programs are being executed, the device node has not yet been created, so acting upon the device in any way is not possible,

规则示例:SUBSYSTEM=="usb", PROGRAM="/bin/device_namer %k", SYMLINK+="%c"

所以我无法从那里写入/dev/ttyUSBx 来识别设备。然后,我有了 RUN 功能,但它似乎无法创建新的 SYMLINK,因为 udev 不会获得 RUN 的输出。

规则示例:SUBSYSTEM=="usb", RUN="/bin/program"

我可以从该 RUN 脚本指示 udev 创建符号链接(symbolic link)吗?或者我可以从那里手动创建该符号链接(symbolic link)吗?

谢谢

最佳答案

一连接到电脑就自动在串口上盲目聊天是一件很可怕的事情。你确定你要这么做吗?首先,这需要一些时间,如果 udev 在创 build 备节点之前必须等待结果,这将延迟设备节点的出现。如果设备碰巧断电或者它的串行端口断开连接,那么你将无法正确命名它(并且你需要有一个超时来检测这个)。最后,如果连接了您期望的设备之外的另一台设备,您可能会向它发送垃圾,从而产生意想不到的后果。

您可以考虑依靠适配器的序列号来区分它们,并以一致的方式将每个适配器关联到外部设备。如果您的适配器甚至真正的序列号而不是像 00000000 这样的占位符字符串,那么您就已经很幸运了!

尽管如此,这就是您的做法。

如您所料,您不能使用RUN,因为为时已晚,设备节点已经创建。您必须使用 PROGRAM。在您的程序中,您将不得不使用 mknod 自己创 build 备节点,因为 udev 还没有这样做。您应该在临时位置创建一个临时节点,并在程序退出前销毁它。

### Create the temporary device node in /tmp
device="/tmp/udev_device_guesser.$$"
# Note: mknod does not appear to be vulnerable to a symlink attack
mknod "$device" c "$MAJOR" "$MINOR"

### Use this device node to query what's attached to the serial port
insert your code here

### Get rid of the temporary node
rm -f "$device"
exit 0

关于linux - 根据设备响应而不是 udev 设备信息使用 udev 创 build 备符号链接(symbolic link),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5682874/

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