linux获取usb设备插拔事件,请根据libudev的实现方法,但是不要使用libudev库,请用C语言写出程序
时间: 2024-02-27 07:52:55 浏览: 226
以下是使用 C 语言调用内核库实现获取 USB 设备插拔事件的程序:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <linux/netlink.h>
#include <sys/socket.h>
#define UEVENT_BUFFER_SIZE 2048
int main(int argc, char **argv) {
int fd = socket(AF_NETLINK, SOCK_DGRAM, NETLINK_KOBJECT_UEVENT);
if (fd < 0) {
perror("Failed to create socket");
return EXIT_FAILURE;
}
struct sockaddr_nl addr;
memset(&addr, 0, sizeof(addr));
addr.nl_family = AF_NETLINK;
addr.nl_groups = NETLINK_KOBJECT_UEVENT;
if (bind(fd, (struct sockaddr *)&addr, sizeof(addr)) < 0) {
perror("Failed to bind socket");
close(fd);
return EXIT_FAILURE;
}
char buf[UEVENT_BUFFER_SIZE];
while (1) {
ssize_t n = recv(fd, buf, sizeof(buf), 0);
if (n < 0) {
perror("Failed to receive data");
close(fd);
return EXIT_FAILURE;
}
char *p = buf;
while (p < buf + n) {
printf("%s\n", p);
p += strlen(p) + 1;
}
}
close(fd);
return EXIT_SUCCESS;
}
```
该程序通过创建一个 NETLINK 套接字,监听内核发送给用户空间的 uevent 消息,解析消息中的字符串,判断是否为 USB 设备的插拔事件,并输出相应的信息。需要注意的是,该程序需要在 root 权限下运行。
阅读全文