一、kobject_uevent_env
是 Linux 内核中的一个函数,用于发送内核事件到用户空间。它主要用于生成和发送与内核对象(kobject)相关的事件通知,这些事件通常用于通知用户空间程序(如 udev)有关硬件的变化或其他系统状态变化。
二、用户空间程序可以通过使用 netlink 套接字来接收 kobject_uevent_env
发送的消息。
三、测试C语言代码
3.1 kernel 使用kobject_uevent_env 发送信息。
3.2 c语言app代码
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/socket.h>
#include <linux/netlink.h>
#include <errno.h>
#define UEVENT_BUFFER_SIZE 512
#define NETLINK_KOBJECT_UEVENT 15
int main(void) {
struct sockaddr_nl sa;
int sock;
char buf[UEVENT_BUFFER_SIZE];
sock = socket(AF_NETLINK, SOCK_DGRAM, NETLINK_KOBJECT_UEVENT);//在较新的 Linux 内核版本中,NETLINK_KOBJECT_UEVENT 的值是 15
if (sock < 0) {
perror("socket");
return -1;
}
memset(&sa, 0, sizeof(sa));
sa.nl_family = AF_NETLINK;
sa.nl_groups = 1;
if (bind(sock, (struct sockaddr *)&sa, sizeof(sa)) < 0) {
perror("bind");
close(sock);
return -1;
}
while (1) {
printf("Waiting data............\n");
int len = recv(sock, buf, sizeof(buf), 0);
if (len < 0) {
perror("recv");
close(sock);
return -1;
}
printf("Read len=%d\n",len);
for (int i = 0; i < len; ) {
char *event = buf + i;
printf("DATA:%s \r\n",event);
if (strncmp(event, "USB_STATE=DISCONNECTED",strlen("USB_STATE=DISCONNECTED")) == 0) {
printf("USB device is disconnected!\n");
}
i += strlen(event) + 1;
}
}
close(sock);
return 0;
}
四、实例运行效果,当USB 口有变化的时候,会接收到消息。