阅读量:0
一、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 口有变化的时候,会接收到消息。