假设在Linux下存在以下情况:
从USB串行转换器设备(/dev/ttyUSB0
)连续读取过程。该设备突然被拔出并再次插入(或出于某种原因而将其自身重置)。进程继续具有有效的文件句柄,/dev/ttyUSB0
但除非重新打开设备(因为udev已删除并重新创建设备节点),否则它将不会从设备接收任何数据。
是否有检测这种情况的直接方法(即不是通过检测数据流中的超时来间接检测),以便进程知道必须重新打开设备?难道是可靠监控的修改时间/dev/ttyUSB0
使用stat()
?
额外细节:
该过程使用标准open()
功能打开设备文件。
/dev
是由所tmpfs
控制udev
。
注意:我不想为此使用任何udev规则,而是希望在过程中直接实现的解决方案。
我想用libudev来监视某些设备.具体来说,我想监控可移动存储:USB硬盘,USB密钥,SD卡等.如果你知道设备的父系统的'子系统'和'devtype',libudev API可以让你找到一个设备.我在我的计算机上尝试了这些设备并使用udevadm发现所有存储类型都有'block' - >'scsi'的设备子系统,但我不知道这些设备有什么样的devtype.是否有一个devtypes和子系统的列表,我可以在某处使用它作为参考,或者是一个更好的方法来查找devtype?
当我连接/断开电源时,我试图让 udev 运行几个小脚本。我在 /etc/udev/rules.d/50-caff.rules 中有以下代码:
SUBSYSTEM=="power_supply", ENV{POWER_SUPPLY_STATUS}=="Charging", RUN+="/home/haukur/rules/off.sh"
SUBSYSTEM=="power_supply", ENV{POWER_SUPPLY_STATUS}=="Discharging", RUN+="/home/haukur/rules/on.sh"
Run Code Online (Sandbox Code Playgroud)
这是on.sh:
#!/bin/sh
caffeine -a
Run Code Online (Sandbox Code Playgroud)
和off.sh:
#!/bin/sh
caffeine -d
Run Code Online (Sandbox Code Playgroud)
不管怎样,我写了这些,写进udevadm control --reload-rules
了 bash ……什么也没发生。当我插上或拔下电源时,咖啡因似乎根本没有激活。
根据/var/log/syslog
(Ubuntu 的替代品/var/log/messages
),udev 在我拔下插头时会识别:
Feb 26 08:44:52 (none) udevd[3838]: starting '/home/haukur/rules/off.sh'
Run Code Online (Sandbox Code Playgroud)
但是当它尝试运行 off.sh(它本身尝试运行咖啡因)时,它返回此错误:
udevd[2719]: '/home/haukur/rules/off.sh'(err) '** (caffeine:3840): WARNING **: Command line `dbus-launch --autolaunch=62907743a139af9b3c86412e00000026 --binary-syntax --close-stderr' exited with non-zero exit status 1: Autolaunch error: X11 initialization failed.\n'
Run Code Online (Sandbox Code Playgroud)
你知道有什么方法可以解决这个问题吗?使用 xmonad WM 运行 Ubuntu 12.04 LTS。
我想使用一个简单的 Perl 脚本在每次连接(例如我的蓝牙耳机)时进行一些配置。我尝试使用Net::DBus,但我的操作系统/DE(Fedora 17、GNOME3)不再使用 HAL。
我真的不想为此安装 HAL,那么我该怎么办?到目前为止我的想法:
org.freedesktop.Hal
. 问题:我找不到相应的服务,org.freedesktop.UDisks
似乎只监视磁盘(废话)。UDev 是否会为其他设备发送 DBus 消息?如果没有,我可以对其进行配置吗?或者我可能完全不在状态,而 UDev 甚至不是我所需要的。文档和谷歌在这件事上都没有真正的帮助。解决方法是如果有人知道如何让 GNOME3 默认将音频输出切换到新连接的蓝牙耳机,但无论如何我想学习类似的脚本内容。
预先感谢您的任何指点!
A。
PS:顺便说一下,Google&Co. 声称 UDev 获取设备并向 HAL 发送消息,HAL 进而通知 DBus。事实绝对不是这样,因为 HAL 甚至不在 Fedora Repos aymore 中。
我正在编写一个 udev 规则来设置两个串行端口的名称。我想在符号链接中使用属性bInterfaceNumber的值。
我的规则是:
子系统==“usb”,驱动程序==“usb”,ATTRS {idVendor} ==“0403”,ATTRS {idProduct}==“6010”,SYMLINK + =“toto%s {bInterfaceNumber}”
规则与设备匹配,但从未找到属性值。
以下是一台设备的层次结构视图:
console@host:udevadm info --name=/dev/ttyUSB0 --attribute-walk
looking at parent device '/devices/pci0000:00/0000:00:14.0/usb1/1-1/1-1:1.0':
KERNELS=="1-1:1.0"
SUBSYSTEMS=="usb"
DRIVERS=="ftdi_sio"
ATTRS{bInterfaceNumber}=="00"
looking at parent device '/devices/pci0000:00/0000:00:14.0/usb1/1-1':
KERNELS=="1-1"
SUBSYSTEMS=="usb"
DRIVERS=="usb"
ATTRS{idVendor}=="0403"
ATTRS{idProduct}=="6010"
Run Code Online (Sandbox Code Playgroud)
提前致谢
我的代码会在每次 udev 检测到新 USB 时运行。
当我以本地用户身份运行它时,我的代码工作正常。
但是当我使用 udev.rules 文件时它失败了,因为它以 root 身份运行我的脚本。
如何以本地用户身份运行“.rules”?
这是我的简单 udev 规则:
ACTION=="add",SUBSYSTEM=="usb",DEVPATH=="/devices/pci0000:00/0000:00:14.0/usb3/3-13",RUN+="/opt/usb-libvirt-hotplug/ usb-libvirt-hotplug.sh debian_testing" ACTION=="add",SUBSYSTEM=="usb",DEVPATH=="/devices/pci0000:00/0000:00:14.0/usb3/3-14",RUN+=" /opt/usb-libvirt-hotplug/usb-libvirt-hotplug.sh debian_testing"
这个被调用的脚本不是我的,但它只是计算出该端口上的 USB 设备的设备总线和编号,并将其添加到 libvirt 来宾 xml。
问题是当我在端口 13 或 14 上物理插入一些东西时,这工作正常,但是当 PC 启动并且 USB 设备已经插入时,这些规则不适用并且脚本不会被调用。
我该如何解决?
先感谢您。
我正在编写一个应用程序自动检测设备是否插入/拔出。
我在 Qt 框架中使用了 C++。libudev.h包含在我的代码中。我实际上通过sudo apt-get install libudev-dev
以下方式成功安装了 libudev-dev 包,但 QtCreator 仍然有一条错误消息:libudev development package not found
文件.pro:
...
CONFIG += console c++11
CONFIG -= app_bundle
unix: CONFIG += link_pkgconfig
unix: PKGCONFIG += libudev
HEADERS += DeviceManager.h
SOURCES += main.cpp \
DeviceManager.cpp
...
Run Code Online (Sandbox Code Playgroud)
设备管理器.h文件:
#ifndef DEVICEMANAGER_H
#define DEVICEMANAGER_H
#include <QObject>
#include <QDebug>
#include <QSet>
#include <libudev.h>
#include "DeviceModel.h"
class DeviceManager : public QObject
{
Q_OBJECT
public:
explicit DeviceManager(QObject *parent = 0);
QSet<DeviceModel *> getDevices();
QStringList getDevicePaths(); …
Run Code Online (Sandbox Code Playgroud) 在我的 Linux 机器上构建 Flutter 应用程序时,我遇到了以下错误:
FAILURE: Build failed with an exception.
* What went wrong:
Execution failed for task ':app:copyFlutterAssetsDebug'.
> Could not copy file '/FwzFiles/GitHub/nilai_sekolah/build/app/intermediates/flutter/debug/android-arm64/flutter_assets' to '/FwzFiles/GitHub/nilai_sekolah/build/app/intermediates/merged_assets/debug/mergeDebugAssets/out/flutter_assets'.
* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output. Run with --scan to get full insights.
Run Code Online (Sandbox Code Playgroud)
我必须使用本教程设置我的 Android 设备 (Google Pixel 2) (这需要我更改 udev 权限),那么这是否与错误有关?我能够将文件pull
保存push
到我的设备上。
我该如何修复这个错误?
我有一个 udev 规则,可以/dev
根据 USB 设备的序列号为它们生成符号链接(我有多个其他方面相同的设备,但需要可重现的设备端点)。
目前我需要为每个新序列号添加一条规则,如下所示:
SUBSYSTEM=="tty", ATTRS{idVendor}=="10c4", ATTRS{idProduct}=="ea60", ATTRS{serial}=="S101", SYMLINK+="ttyS101"
SUBSYSTEM=="tty", ATTRS{idVendor}=="10c4", ATTRS{idProduct}=="ea60", ATTRS{serial}=="S102", SYMLINK+="ttyS102"
...
Run Code Online (Sandbox Code Playgroud)
我正在寻找一种使用单个规则来执行此操作的方法,所有可动态访问的都是%k
、%n
和%c
,但我发现无法访问任何其他值。使用PROGRAM=""
可能是一种方法,但我如何从那里访问 ATTRS?
我试过这个:
SUBSYSTEM=="tty", ATTRS{idVendor}=="10c4", ATTRS{idProduct}=="ea60", ATTRS{serial}=="S101", PROGRAM="/bin/sh -c 'udevadm info /dev/%k | grep ID_SERIAL_SHORT= | cut -d= -f 2'" SYMLINK+="tty%c"
Run Code Online (Sandbox Code Playgroud)
但它看起来/dev/%k
在程序运行时不可用,所以这也不起作用。
有什么办法可以用于ATTRS{serial}
我的SYMLINK+=""
吗?