网线插拔不通知udev
时间: 2023-08-09 07:04:18 浏览: 244
如果您发现网线插拔无法通知udev,可能是因为您的系统没有安装libudev-dev或udev-devel等udev开发库文件。在这种情况下,您需要执行以下步骤:
1. 打开终端,使用以下命令安装udev开发库文件:
对于Debian/Ubuntu系统:
```
sudo apt-get install libudev-dev
```
对于CentOS/RHEL系统:
```
sudo yum install libudev-devel
```
2. 安装完成后,请重新加载udev规则:
```
sudo udevadm control --reload-rules
```
3. 现在,尝试插入或拔出网线,看看是否能够正确通知udev并运行指定的程序。
如果问题仍然存在,请确保您的udev规则文件中的SUBSYSTEM和ACTION参数正确,并且程序路径也正确无误。
相关问题
linux 网线插拔时调用程序
您可以通过在Linux系统中使用udev规则来实现网线插拔时调用程序的功能。具体步骤如下:
1. 打开终端,运行以下命令创建一个新的udev规则文件:
```
sudo nano /etc/udev/rules.d/99-custom.rules
```
2. 在打开的文件中添加以下内容:
```
SUBSYSTEM=="net", ACTION=="add", RUN+="/path/to/your/program"
```
其中,/path/to/your/program是您要运行的程序的路径。如果您想在网线拔出时运行程序,将ACTION=="add"改为ACTION=="remove"即可。
3. 保存并关闭文件,然后重新加载udev规则:
```
sudo udevadm control --reload-rules
```
现在,当您插入或拔出网线时,指定的程序将自动运行。请注意,您需要以root权限运行udev规则,否则无法生效。
udev 监测插拔设备 C语言实现程序
以下是一个简单的 C 语言实现程序,用于监测 udev 插拔设备:
```c
#include <libudev.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main(void)
{
struct udev *udev;
struct udev_monitor *mon;
int fd;
udev = udev_new();
if (!udev) {
printf("Failed to create udev\n");
return 1;
}
mon = udev_monitor_new_from_netlink(udev, "udev");
udev_monitor_filter_add_match_subsystem_devtype(mon, "usb", "usb_device");
udev_monitor_enable_receiving(mon);
fd = udev_monitor_get_fd(mon);
while (1) {
fd_set fds;
struct timeval tv;
int ret;
FD_ZERO(&fds);
FD_SET(fd, &fds);
tv.tv_sec = 1;
tv.tv_usec = 0;
ret = select(fd + 1, &fds, NULL, NULL, &tv);
if (ret > 0 && FD_ISSET(fd, &fds)) {
struct udev_device *dev = udev_monitor_receive_device(mon);
if (dev) {
const char *action = udev_device_get_action(dev);
const char *devnode = udev_device_get_devnode(dev);
const char *vendor = udev_device_get_property_value(dev, "ID_VENDOR_FROM_DATABASE");
const char *product = udev_device_get_property_value(dev, "ID_MODEL_FROM_DATABASE");
if (action && devnode && vendor && product) {
printf("Device %s (%s %s) %s\n", devnode, vendor, product, action);
}
udev_device_unref(dev);
}
}
}
udev_monitor_unref(mon);
udev_unref(udev);
return 0;
}
```
该程序首先创建了一个 `udev` 对象,然后创建一个 `udev_monitor` 对象,并添加一个匹配 `usb` 子系统和 `usb_device` 设备类型的规则。接下来,程序启用接收功能并获取文件描述符。接下来,程序进入一个无限循环,调用 `select()` 函数阻塞等待事件,并在收到事件时处理设备变更。程序获取 `udev_device` 对象,并打印设备节点路径、设备制造商和产品信息以及设备行为。最后,程序释放相关资源并退出。
请注意,此程序仅用于演示目的,实际使用时可能需要添加更多的错误处理和异常情况处理。
阅读全文