可以通过netlink获取吗
时间: 2024-04-23 10:25:03 浏览: 116
可以通过Netlink获取"ub_port_status failed (err = -32)"的信息。在Linux内核中,Netlink是一种用于内核与用户空间之间通信的机制,可以通过Netlink接口获取内核的事件和状态信息。
可以使用libnl库,通过Netlink接口获取USB设备状态信息。具体步骤如下:
1. 使用nl_socket_alloc函数创建一个Netlink socket。
2. 使用genl_connect函数连接到内核的GENL (Generic Netlink)协议。
3. 使用genl_ctrl_resolve函数获取"cdc-wdm" Netlink族的ID。
4. 使用genlmsg_put函数创建一个包含"cdc-wdm"族的GET_FAMILY消息。
5. 使用nla_put_u32函数添加一个NLA (Netlink Attribute)标签,指定要获取的USB设备的端口号。
6. 使用nl_send_auto函数发送消息到内核。
7. 使用nl_recvmsgs_default函数接收内核返回的消息,并解析消息中的USB设备状态信息。
需要注意的是,使用Netlink获取USB设备状态信息需要一定的编程经验和技能。如果没有相关经验,建议寻求专业的技术支持。
相关问题
是通过netlink监控吗
是的,udev是通过监听内核发送的netlink消息来实现对uevent的监听和处理的。Netlink是Linux内核中的一种通信机制,它可以实现内核和用户空间之间的异步双向通信。udev就是通过监听内核发送的netlink消息,来获取设备的相关信息并进行相应的操作,例如自动挂载、自动识别等。当内核发生设备插入或移除等事件时,会生成相应的uevent并通过netlink机制发送到用户空间,udev就可以根据接收到的uevent来进行相应的处理。因此,可以说udev是通过netlink来监控和处理uevent的。
请使用netlink获取usb设备插拔事件,并提取出设备类型,名字,pid vid 文件路径等信息,请用C语言写出程序
好的,以下是一个简单的C程序,使用netlink获取usb设备插拔事件,并提取设备类型,名字,pid vid 文件路径等信息:
```
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <linux/netlink.h>
#include <linux/rtnetlink.h>
#include <linux/usb/ch9.h>
#define UEVENT_BUFFER_SIZE 2048
int main()
{
struct sockaddr_nl nls;
struct msghdr msg;
struct iovec iov;
char buffer[UEVENT_BUFFER_SIZE];
int ret, fd, len;
struct nlmsghdr *nh;
struct udev_device *dev;
char *action, *subsystem, *devtype, *devname, *pid, *vid, *path;
memset(&nls, 0, sizeof(nls));
nls.nl_family = AF_NETLINK;
nls.nl_pid = getpid();
nls.nl_groups = -1;
if ((fd = socket(PF_NETLINK, SOCK_RAW, NETLINK_KOBJECT_UEVENT)) == -1) {
perror("socket");
exit(EXIT_FAILURE);
}
if (bind(fd, (struct sockaddr *)&nls, sizeof(nls)) == -1) {
perror("bind");
exit(EXIT_FAILURE);
}
memset(&msg, 0, sizeof(struct msghdr));
iov.iov_base = buffer;
iov.iov_len = sizeof(buffer);
msg.msg_name = (void *)&nls;
msg.msg_namelen = sizeof(nls);
msg.msg_iov = &iov;
msg.msg_iovlen = 1;
while (1) {
len = recvmsg(fd, &msg, 0);
if (len == -1) {
perror("recvmsg");
exit(EXIT_FAILURE);
}
nh = (struct nlmsghdr *)buffer;
while (NLMSG_OK(nh, len)) {
if (nh->nlmsg_type == NLMSG_DONE)
break;
else if (nh->nlmsg_type == NLMSG_ERROR) {
perror("NLMSG_ERROR");
exit(EXIT_FAILURE);
}
else if (nh->nlmsg_type == UDEV_MONITOR) {
action = strstr(NLMSG_DATA(nh), "ACTION=");
if (action != NULL) {
subsystem = strstr(NLMSG_DATA(nh), "SUBSYSTEM=");
devtype = strstr(NLMSG_DATA(nh), "DEVTYPE=");
devname = strstr(NLMSG_DATA(nh), "DEVNAME=");
pid = strstr(NLMSG_DATA(nh), "ID_VENDOR_ID=");
vid = strstr(NLMSG_DATA(nh), "ID_PRODUCT_ID=");
path = strstr(NLMSG_DATA(nh), "DEVPATH=");
if (action != NULL && subsystem != NULL && devtype != NULL &&
devname != NULL && pid != NULL && vid != NULL && path != NULL) {
printf("Action: %s\n", action + strlen("ACTION="));
printf("Subsystem: %s\n", subsystem + strlen("SUBSYSTEM="));
printf("Devtype: %s\n", devtype + strlen("DEVTYPE="));
printf("Devname: %s\n", devname + strlen("DEVNAME="));
printf("Pid: %s\n", pid + strlen("ID_VENDOR_ID="));
printf("Vid: %s\n", vid + strlen("ID_PRODUCT_ID="));
printf("Path: %s\n", path + strlen("DEVPATH="));
printf("\n");
}
}
}
nh = NLMSG_NEXT(nh, len);
}
}
close(fd);
return 0;
}
```
这个程序使用了netlink套接字来接收内核发送的消息,然后解析消息中的信息,提取出usb设备的相关信息,包括设备类型,名字,pid vid 文件路径等信息。
阅读全文