2024-07-24 buildroot c语言应用获取 kernel kobject_uevent_env 发送的消息,侦测USB口变化。

avatar
作者
猴君
阅读量: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 口有变化的时候,会接收到消息。

广告一刻

为您即时展示最新活动产品广告消息,让您随时掌握产品活动新动态!